Отсортированный по алфавиту список файлов в каталоге на NTFS

Frame Relay
Дата: 26.05.2015 10:33:07
Доброго всем времени суток.

Возникла задача удаления самых старых файлов в каталоге (Windows 7, NTFS). Язык C/C++.
Причём очень желательно без посторонних библиотек (типа boost).

Файлы (данные с прибора) время от времени добавляются (но не изменяются) в определённый каталог. Чтобы не переполнить диск, требуется при уменьшении пустого места на диске ниже заданного предела удалять файлы с наименьшей датой создания.

Обычно для этого используются функции API FindFirstFile()/FindNextFile(). Но в них невозможно задать порядок сортировки.
Лобовой вариант — вывести все файлы с датами в список и отсортировать. Но на это нужно некоторое время (хотя диск SSD).

Быстрый вариант — использовать фичу NTFS: возвращение имён файлов в алфавитном порядке.
Имена файлов в вышеупомянутом каталоге создаются по дате: 4-значный год плюс 2-значный месяц плюс 2-значный день и т.д. до микросекунд включительно. Т.е. при сортировке в прямом алфавитном порядке первый файл будет самый старый.

Но всегда ли NTFS выдаёт список имён в алфавитном порядке? В MSDN написано usually. Что может влиять на это?

Или же "семёрка" имеет встроенные возможности по выдаче отсортированного по нужному критерию списка имён файлов?

С такой задачей не сталкивался много лет, и велосипед изобретать не хочется.
Dima T
Дата: 26.05.2015 10:53:53
Frame Relay
Но всегда ли NTFS выдаёт список имён в алфавитном порядке? В MSDN написано usually. Что может влиять на это?

Я так понимаю что это из-за локализации некоторых языков. http://www.transl-gunsmoker.ru/2010/07/ntfs.html
В твоем случае, если в имени только цифры, то должно быть всегда отсортировано.
mayton
Дата: 26.05.2015 10:56:55
Имена в формате YYYY-MM-DD - это правильное решение данной задачи. Единственное, я-бы проверил
на всякий случай что диск не является FAT32/ExFat на всякий случай.
Frame Relay
Дата: 26.05.2015 11:18:01
В каталоге только файлы с "цифровыми" именами. Такое именование по условиям поставленной задачи.
Также по условиям файловая система NTFS (FAT неприменима), и только Винда не ниже "семёрки".

А на что влияет системная служба индексирования (Индексирует содержимое и свойства файлов на локальном и удаленных компьютерах, обеспечивает быстрый доступ к файлам с помощью гибкого языка запросов)?
Вроде бы это не совсем по теме, но здесь и Windows и C++.
mayton
Дата: 26.05.2015 11:26:04
Frame Relay
А на что влияет системная служба индексирования (Индексирует содержимое и свойства файлов на локальном и удаленных компьютерах, обеспечивает быстрый доступ к файлам с помощью гибкого языка запросов)?
Вроде бы это не совсем по теме, но здесь и Windows и C++.

Для твоей задачи эта служба совершенно не нужна. Она индексирует контент MS-овских документов
для поиска по содержанию.
Dima T
Дата: 26.05.2015 11:45:17
Frame Relay
Файлы (данные с прибора) время от времени добавляются (но не изменяются) в определённый каталог. Чтобы не переполнить диск, требуется при уменьшении пустого места на диске ниже заданного предела удалять файлы с наименьшей датой создания.

Обычно подобные задачи немного по другому решаются: задаешь срок хранения, как только пролежало больше положенного - удаляешь. Т.е. перебор всех файлов и удаление старше заданной даты.

Если файлов очень много, то можешь в отдельном потоке (или процессе) этим заниматься.
mayton
Дата: 26.05.2015 12:37:29
Меня тоже раньше зацепляла мысль о том как оптимально чистить трей.
Особенно когда его размер переваливает за несколько сот гигов и сложно
сказать чё там актуально и чё нет.

Линуксоиды пишут для этого скриптик типа (сорь могу ошибиться в синтаксисе).

$ find /tmp/* -mtime +30 -exec rm {} \;


Он чистит файлы старше 1 месяца.

Гуглил по разным ключевым словам, но не нашёл ФС которая индексирует именно
дату создания/доступа к файлу для его последующего быстрого удаления.

Есть отдельное решение tempfs но оно решает немножко другие задачи.
MasterZiv
Дата: 26.05.2015 12:43:17
Frame Relay,

похоже, тебе нужен какой-то другой глобус, да ?
MasterZiv
Дата: 26.05.2015 12:45:52
Вот это:

Frame Relay
Лобовой вариант — вывести все файлы с датами в список и отсортировать. Но на это нужно некоторое время (хотя диск SSD).


самый хороший вариант. Скорость диска тут ни при чём, поскольку сортировка должна быть в памяти, а не на диске,
от диска будет только чтение каталога.

Файлов в каталоге всегда мало, так что сортировка не составит большого труда.
Frame Relay
Дата: 26.05.2015 13:08:44
Спасибо за полезные советы.

Раз служба индексирования не нужна, то на целевой системе её можно отключить. Документов там нет.

Удалением как раз и будет заниматься отдельный процесс.

Но удалять всё-таки буду не по сроку, а по свободному месту — целевая система (встроенная в прибор, Windows Embedded) выполняет только одно задание.
Файлов в каталоге может быть и сотни и тысячи, но они никому не мешают. Главное — не забивать диск (он по совместительству системный). Впрочем, если даже писать на отдельный диск, всё равно его придётся чистить.
А вот возможность получить очень старые (но не устаревшие) данные приветствуется. Условия задачи такие.

Линукс пока в качестве платформы не рассматриваю. С PowerShell знаком слабо, поэтому скрипт удаления делать не буду.

Поскольку файлов может быть очень много (но это не значит, что они сплошняком будут писаться, да и размер максимум несколько мегабайт) — сортировка даже в памяти не очень выгодна (процессор небыстрый и холодный). Да и память тоже ограничена.

Поэтому я остановился на использовании сортировки силами самой NTFS. Всё равно имена файлов должны показывать дату их создания. При этом дополнительных ресурсов процессора и памяти не требуется, тем более удаление старых файлов — задача вспомогательная.