Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Доброго всем времени суток. Возникла задача удаления самых старых файлов в каталоге (Windows 7, NTFS). Язык C/C++. Причём очень желательно без посторонних библиотек (типа boost). Файлы (данные с прибора) время от времени добавляются (но не изменяются) в определённый каталог. Чтобы не переполнить диск, требуется при уменьшении пустого места на диске ниже заданного предела удалять файлы с наименьшей датой создания. Обычно для этого используются функции API FindFirstFile()/FindNextFile(). Но в них невозможно задать порядок сортировки. Лобовой вариант — вывести все файлы с датами в список и отсортировать. Но на это нужно некоторое время (хотя диск SSD). Быстрый вариант — использовать фичу NTFS: возвращение имён файлов в алфавитном порядке. Имена файлов в вышеупомянутом каталоге создаются по дате: 4-значный год плюс 2-значный месяц плюс 2-значный день и т.д. до микросекунд включительно. Т.е. при сортировке в прямом алфавитном порядке первый файл будет самый старый. Но всегда ли NTFS выдаёт список имён в алфавитном порядке? В MSDN написано usually. Что может влиять на это? Или же "семёрка" имеет встроенные возможности по выдаче отсортированного по нужному критерию списка имён файлов? С такой задачей не сталкивался много лет, и велосипед изобретать не хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 10:33 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame RelayНо всегда ли NTFS выдаёт список имён в алфавитном порядке? В MSDN написано usually. Что может влиять на это? Я так понимаю что это из-за локализации некоторых языков. http://www.transl-gunsmoker.ru/2010/07/ntfs.html В твоем случае, если в имени только цифры, то должно быть всегда отсортировано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 10:53 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Имена в формате YYYY-MM-DD - это правильное решение данной задачи. Единственное, я-бы проверил на всякий случай что диск не является FAT32/ExFat на всякий случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 10:56 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
В каталоге только файлы с "цифровыми" именами. Такое именование по условиям поставленной задачи. Также по условиям файловая система NTFS (FAT неприменима), и только Винда не ниже "семёрки". А на что влияет системная служба индексирования (Индексирует содержимое и свойства файлов на локальном и удаленных компьютерах, обеспечивает быстрый доступ к файлам с помощью гибкого языка запросов)? Вроде бы это не совсем по теме, но здесь и Windows и C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 11:18 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame RelayА на что влияет системная служба индексирования (Индексирует содержимое и свойства файлов на локальном и удаленных компьютерах, обеспечивает быстрый доступ к файлам с помощью гибкого языка запросов)? Вроде бы это не совсем по теме, но здесь и Windows и C++. Для твоей задачи эта служба совершенно не нужна. Она индексирует контент MS-овских документов для поиска по содержанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 11:26 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame RelayФайлы (данные с прибора) время от времени добавляются (но не изменяются) в определённый каталог. Чтобы не переполнить диск, требуется при уменьшении пустого места на диске ниже заданного предела удалять файлы с наименьшей датой создания. Обычно подобные задачи немного по другому решаются: задаешь срок хранения, как только пролежало больше положенного - удаляешь. Т.е. перебор всех файлов и удаление старше заданной даты. Если файлов очень много, то можешь в отдельном потоке (или процессе) этим заниматься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 11:45 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Меня тоже раньше зацепляла мысль о том как оптимально чистить трей. Особенно когда его размер переваливает за несколько сот гигов и сложно сказать чё там актуально и чё нет. Линуксоиды пишут для этого скриптик типа (сорь могу ошибиться в синтаксисе). Код: powershell 1. Он чистит файлы старше 1 месяца. Гуглил по разным ключевым словам, но не нашёл ФС которая индексирует именно дату создания/доступа к файлу для его последующего быстрого удаления. Есть отдельное решение tempfs но оно решает немножко другие задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 12:37 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame Relay, похоже, тебе нужен какой-то другой глобус, да ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 12:43 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Вот это: Frame RelayЛобовой вариант — вывести все файлы с датами в список и отсортировать. Но на это нужно некоторое время (хотя диск SSD). самый хороший вариант. Скорость диска тут ни при чём, поскольку сортировка должна быть в памяти, а не на диске, от диска будет только чтение каталога. Файлов в каталоге всегда мало, так что сортировка не составит большого труда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 12:45 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Спасибо за полезные советы. Раз служба индексирования не нужна, то на целевой системе её можно отключить. Документов там нет. Удалением как раз и будет заниматься отдельный процесс. Но удалять всё-таки буду не по сроку, а по свободному месту — целевая система (встроенная в прибор, Windows Embedded) выполняет только одно задание. Файлов в каталоге может быть и сотни и тысячи, но они никому не мешают. Главное — не забивать диск (он по совместительству системный). Впрочем, если даже писать на отдельный диск, всё равно его придётся чистить. А вот возможность получить очень старые (но не устаревшие) данные приветствуется. Условия задачи такие. Линукс пока в качестве платформы не рассматриваю. С PowerShell знаком слабо, поэтому скрипт удаления делать не буду. Поскольку файлов может быть очень много (но это не значит, что они сплошняком будут писаться, да и размер максимум несколько мегабайт) — сортировка даже в памяти не очень выгодна (процессор небыстрый и холодный). Да и память тоже ограничена. Поэтому я остановился на использовании сортировки силами самой NTFS. Всё равно имена файлов должны показывать дату их создания. При этом дополнительных ресурсов процессора и памяти не требуется, тем более удаление старых файлов — задача вспомогательная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 13:08 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame Relayсортировка даже в памяти не очень выгодна Это если использовать quick sort для которого уже отсортированный входной поток это как раз наихудший вариант. Сортировка вставками в этих условиях выигрывает абсолютно, даже у пузырька. И при этом не занимает процессор. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 13:18 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Линукс пока в качестве платформы не рассматриваю. С PowerShell знаком слабо, поэтому скрипт удаления делать не буду. А вот это зря. Не знаю что у тебя там за версия шела стоит но я-бы вообще начал решать эту задачу со скрипта. А потом уже перешёл к т.н. "процессам". Поскольку файлов может быть очень много (но это не значит, что они сплошняком будут писаться, да и размер максимум несколько мегабайт) — сортировка даже в памяти не очень выгодна (процессор небыстрый и холодный). Да и память тоже ограничена. Поэтому я остановился на использовании сортировки силами самой NTFS. Всё равно имена файлов должны показывать дату их создания. При этом дополнительных ресурсов процессора и памяти не требуется, тем более удаление старых файлов — задача вспомогательная. Сортировки в этой утилитарной задаче вобщем-то не нужны. Можно увеличить число "проходов" чистки (обзор директорий - это дешёвая операция) и эмулировать чистку с конца по 1 дню а потом по 2, 4, 8 и так далее пока не будет достигнуто нужное число free-space. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 13:34 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
mayton, Ну, можно и в памяти вместо полной сотрировки взять top-n. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 14:25 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
maytonА вот это зря. Не знаю что у тебя там за версия шела стоит но я-бы вообще начал решать эту задачу со скрипта. А потом уже перешёл к т.н. "процессам". PowerShell — это Винда. Не никсовый шел. Назначение целевой системы — конвертор промышленных протоколов (шлюз). Функционально ЦС — интерфейсная плата. Win7 Embedded вполне подошла для реализации. Файлы — это текстовые файлы в формате Comtrade (пара *.osc+*.dat). Создаются попарно, и удаляться будут тоже. При этом их генерация — неосновная фича (но потребителю хочется). Скриптами главную задачу (шлюз) точно не решишь. Кстати, если всё-таки придётся сортировать — как насчёт контейнера std::set с точки зрения процессорного времени и памяти (файлов могут быть сотни и тысячи)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 14:37 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame Relayфайлов могут быть сотни и тысячи Это немного. Не то оптимизируешь. Достаточно двух проходов: 1. Убедится что NTFS дает сортированный по имени поток файлов. Можно еще общий размер посчитать если надо. 2. Если поток сортированный. Удалять сколько надо по мере выдачи NTFS`ом. Скорее всего так и будет. 3. Поток несортированный, ищем старшие N файлов (которые удалить). Как понимаю N ~1-5% от исходного количества, т.е. 100-500 для общей кучи в 10000 файлов. Тут во время прохода хранить эти N в <map> и выкидывать лишние из конца по мере вставки в середину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 15:06 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame RelayНазначение целевой системы — конвертор промышленных протоколов (шлюз). Функционально ЦС — интерфейсная плата. Win7 Embedded вполне подошла для реализации. Файлы — это текстовые файлы в формате Comtrade (пара *.osc+*.dat). Создаются попарно, и удаляться будут тоже. При этом их генерация — неосновная фича (но потребителю хочется). Скриптами главную задачу (шлюз) точно не решишь. Возможно ты не понял мою мысль. Скриптинг чистки - это отдельная задача. Возможно работающая по шедулеру. Кстати, если всё-таки придётся сортировать — как насчёт контейнера std::set с точки зрения процессорного времени и памяти (файлов могут быть сотни и тысячи)? Учитывая Embedded - я-бы экономил память. Псевдокод Код: javascript 1. 2. 3. 4. Выдаёт тебе отсортированный список сущностей вида Код: plaintext 1. 2. 3. 4. (я привожу результат команды dir выполненный у себя в Windows-7 prof) Если нужно чистить 1 последний день - то задача уже решена и ничего сортировать не надо. Если у тебя (вдруг!) order меняется на обратный и сначала идут новые файлы а потом старые то не беда. На скорость чистки это мало влияет. Просто надо будет дойти до конца списка. В первом-де случае можно сделать break и выйти чуть раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 15:06 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
А теперь окончательное решение: Поскольку получается, что NTFS гарантированно выдаст цифровые имена файлов в отсортированном как мне нужно порядке, то аз грешный решил не плодить сущности без надобности и просто считывать имена циклом FindFirstFile()/FindNextFile(). Как раз самые старые файлы в начале и пойдут. Тем более такое именование файлов было применено для удобства потребителя, и ничего лишнего делать не придётся. Файлы с шведско-турецкими названиями в целевой каталог попасть могут только принудительно со стороны разработчика/наладчика, ибо для потребителя каталог виден только через FTP, и то только для чтения. Так что алфавитный порядок не нарушится. Что до реализации, то для меня проще сделать приложение на C++ (отдельный процесс). Очистка будет производиться событийно, а не по расписанию (функция WinAPI ReadDirectoryChangesW()). Пока что как оконное приложение, но в следующей версии скорее всего как службу. Удаляться файлы будут при уменьшении свободного места на диске (по условиям задачи так предпочтительнее). Что до способов сортировок, то ваши рекомендации могут в будущем пригодиться. Стандартный контейнер std::set, как я понял, до памяти жадный. Но для данной задачи можно обойтись сортировкой NTFS (другая ФС не предполагается). Всем спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 09:50 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Frame RelayЧто до способов сортировок, то ваши рекомендации могут в будущем пригодиться. Стандартный контейнер std::set, как я понял, до памяти жадный. Если задача сначала все прочитать, затем отсортировать, то быстрее (и меньше памяти) будет сначала все прочитать в обычный массив (или vector) и в конце его отсортировать. set/map удобнее тем что после любого изменения набор остается сортированным, есть поиск, но плата за это меньшая скорость чтения/записи и доп.память для хранения порядка сортировки (плюс 50-100% к размеру данных). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 10:31 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Дима, учитывая embedded-решение я-бы вообще не расчитывал на то что будет доступна вообще какая-то память. Она может быть и она может быть отдана в распоряжение основной задаче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 11:27 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
mayton, ну, вообще есть и внешняя сортировка. Я даже кодом могу поделится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 12:46 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
Спасибо не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 14:52 |
|
||
|
Отсортированный по алфавиту список файлов в каталоге на NTFS
|
|||
|---|---|---|---|
|
#18+
извините что ерничаю , не подскажите куда катится этот мир ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 19:54 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38968444&tid=2018972]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 282ms |
| total: | 457ms |

| 0 / 0 |
