Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отсортированный по алфавиту список файлов в каталоге на NTFS / 22 сообщений из 22, страница 1 из 1
26.05.2015, 10:33
    #38968395
Frame Relay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Доброго всем времени суток.

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

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

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

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

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

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

С такой задачей не сталкивался много лет, и велосипед изобретать не хочется.
...
Рейтинг: 0 / 0
26.05.2015, 10:53
    #38968418
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame RelayНо всегда ли NTFS выдаёт список имён в алфавитном порядке? В MSDN написано usually. Что может влиять на это?
Я так понимаю что это из-за локализации некоторых языков. http://www.transl-gunsmoker.ru/2010/07/ntfs.html
В твоем случае, если в имени только цифры, то должно быть всегда отсортировано.
...
Рейтинг: 0 / 0
26.05.2015, 10:56
    #38968423
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Имена в формате YYYY-MM-DD - это правильное решение данной задачи. Единственное, я-бы проверил
на всякий случай что диск не является FAT32/ExFat на всякий случай.
...
Рейтинг: 0 / 0
26.05.2015, 11:18
    #38968444
Frame Relay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
В каталоге только файлы с "цифровыми" именами. Такое именование по условиям поставленной задачи.
Также по условиям файловая система NTFS (FAT неприменима), и только Винда не ниже "семёрки".

А на что влияет системная служба индексирования (Индексирует содержимое и свойства файлов на локальном и удаленных компьютерах, обеспечивает быстрый доступ к файлам с помощью гибкого языка запросов)?
Вроде бы это не совсем по теме, но здесь и Windows и C++.
...
Рейтинг: 0 / 0
26.05.2015, 11:26
    #38968452
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame RelayА на что влияет системная служба индексирования (Индексирует содержимое и свойства файлов на локальном и удаленных компьютерах, обеспечивает быстрый доступ к файлам с помощью гибкого языка запросов)?
Вроде бы это не совсем по теме, но здесь и Windows и C++.
Для твоей задачи эта служба совершенно не нужна. Она индексирует контент MS-овских документов
для поиска по содержанию.
...
Рейтинг: 0 / 0
26.05.2015, 11:45
    #38968483
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame RelayФайлы (данные с прибора) время от времени добавляются (но не изменяются) в определённый каталог. Чтобы не переполнить диск, требуется при уменьшении пустого места на диске ниже заданного предела удалять файлы с наименьшей датой создания.
Обычно подобные задачи немного по другому решаются: задаешь срок хранения, как только пролежало больше положенного - удаляешь. Т.е. перебор всех файлов и удаление старше заданной даты.

Если файлов очень много, то можешь в отдельном потоке (или процессе) этим заниматься.
...
Рейтинг: 0 / 0
26.05.2015, 12:37
    #38968567
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Меня тоже раньше зацепляла мысль о том как оптимально чистить трей.
Особенно когда его размер переваливает за несколько сот гигов и сложно
сказать чё там актуально и чё нет.

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

Код: powershell
1.
$ find /tmp/* -mtime +30 -exec rm {} \;



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

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

Есть отдельное решение tempfs но оно решает немножко другие задачи.
...
Рейтинг: 0 / 0
26.05.2015, 12:43
    #38968582
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame Relay,

похоже, тебе нужен какой-то другой глобус, да ?
...
Рейтинг: 0 / 0
26.05.2015, 12:45
    #38968586
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Вот это:

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

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

Файлов в каталоге всегда мало, так что сортировка не составит большого труда.
...
Рейтинг: 0 / 0
26.05.2015, 13:08
    #38968621
Frame Relay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Спасибо за полезные советы.

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

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

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

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

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

Поэтому я остановился на использовании сортировки силами самой NTFS. Всё равно имена файлов должны показывать дату их создания. При этом дополнительных ресурсов процессора и памяти не требуется, тем более удаление старых файлов — задача вспомогательная.
...
Рейтинг: 0 / 0
26.05.2015, 13:18
    #38968629
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame Relayсортировка даже в памяти не очень выгодна
Это если использовать quick sort для которого уже отсортированный входной поток это как
раз наихудший вариант. Сортировка вставками в этих условиях выигрывает абсолютно, даже у
пузырька. И при этом не занимает процессор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.05.2015, 13:34
    #38968649
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Линукс пока в качестве платформы не рассматриваю. С PowerShell знаком слабо, поэтому скрипт удаления делать не буду.

А вот это зря. Не знаю что у тебя там за версия шела стоит но я-бы вообще начал решать эту задачу
со скрипта. А потом уже перешёл к т.н. "процессам".

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

Поэтому я остановился на использовании сортировки силами самой NTFS. Всё равно имена файлов должны показывать дату их создания. При этом дополнительных ресурсов процессора и памяти не требуется, тем более удаление старых файлов — задача вспомогательная.
Сортировки в этой утилитарной задаче вобщем-то не нужны. Можно увеличить число "проходов" чистки
(обзор директорий - это дешёвая операция) и эмулировать чистку с конца по 1 дню а потом по 2, 4, 8
и так далее пока не будет достигнуто нужное число free-space.
...
Рейтинг: 0 / 0
26.05.2015, 14:25
    #38968724
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
mayton,

Ну, можно и в памяти вместо полной сотрировки взять top-n.
...
Рейтинг: 0 / 0
26.05.2015, 14:37
    #38968757
Frame Relay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
maytonА вот это зря. Не знаю что у тебя там за версия шела стоит но я-бы вообще начал решать эту задачу
со скрипта. А потом уже перешёл к т.н. "процессам".
PowerShell — это Винда. Не никсовый шел.

Назначение целевой системы — конвертор промышленных протоколов (шлюз). Функционально ЦС — интерфейсная плата.
Win7 Embedded вполне подошла для реализации.
Файлы — это текстовые файлы в формате Comtrade (пара *.osc+*.dat). Создаются попарно, и удаляться будут тоже. При этом их генерация — неосновная фича (но потребителю хочется).
Скриптами главную задачу (шлюз) точно не решишь.

Кстати, если всё-таки придётся сортировать — как насчёт контейнера std::set с точки зрения процессорного времени и памяти (файлов могут быть сотни и тысячи)?
...
Рейтинг: 0 / 0
26.05.2015, 15:06
    #38968804
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame Relayфайлов могут быть сотни и тысячи
Это немного. Не то оптимизируешь.
Достаточно двух проходов:
1. Убедится что NTFS дает сортированный по имени поток файлов. Можно еще общий размер посчитать если надо.
2. Если поток сортированный. Удалять сколько надо по мере выдачи NTFS`ом. Скорее всего так и будет.
3. Поток несортированный, ищем старшие N файлов (которые удалить). Как понимаю N ~1-5% от исходного количества, т.е. 100-500 для общей кучи в 10000 файлов. Тут во время прохода хранить эти N в <map> и выкидывать лишние из конца по мере вставки в середину.
...
Рейтинг: 0 / 0
26.05.2015, 15:06
    #38968805
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame RelayНазначение целевой системы — конвертор промышленных протоколов (шлюз). Функционально ЦС — интерфейсная плата.
Win7 Embedded вполне подошла для реализации.
Файлы — это текстовые файлы в формате Comtrade (пара *.osc+*.dat). Создаются попарно, и удаляться будут тоже. При этом их генерация — неосновная фича (но потребителю хочется).
Скриптами главную задачу (шлюз) точно не решишь.

Возможно ты не понял мою мысль. Скриптинг чистки - это отдельная задача. Возможно работающая
по шедулеру.

Кстати, если всё-таки придётся сортировать — как насчёт контейнера std::set с точки зрения процессорного времени и памяти (файлов могут быть сотни и тысячи)?
Учитывая Embedded - я-бы экономил память.

Псевдокод
Код: javascript
1.
2.
3.
4.
FindFirstFile()
while(..){
    FindNextFile()
}



Выдаёт тебе отсортированный список сущностей вида
Код: plaintext
1.
2.
3.
4.
2011-01-01.osc
2011-01-01.dat
2011-01-02.osc
2011-01-02.dat


(я привожу результат команды dir выполненный у себя в Windows-7 prof)
Если нужно чистить 1 последний день - то задача уже решена и ничего сортировать не надо.

Если у тебя (вдруг!) order меняется на обратный и сначала идут новые файлы а потом старые
то не беда. На скорость чистки это мало влияет. Просто надо будет дойти до конца списка.
В первом-де случае можно сделать break и выйти чуть раньше.
...
Рейтинг: 0 / 0
27.05.2015, 09:50
    #38969445
Frame Relay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
А теперь окончательное решение:
Поскольку получается, что NTFS гарантированно выдаст цифровые имена файлов в отсортированном как мне нужно порядке, то аз грешный решил не плодить сущности без надобности и просто считывать имена циклом FindFirstFile()/FindNextFile(). Как раз самые старые файлы в начале и пойдут.
Тем более такое именование файлов было применено для удобства потребителя, и ничего лишнего делать не придётся. Файлы с шведско-турецкими названиями в целевой каталог попасть могут только принудительно со стороны разработчика/наладчика, ибо для потребителя каталог виден только через FTP, и то только для чтения. Так что алфавитный порядок не нарушится.

Что до реализации, то для меня проще сделать приложение на C++ (отдельный процесс). Очистка будет производиться событийно, а не по расписанию (функция WinAPI ReadDirectoryChangesW()). Пока что как оконное приложение, но в следующей версии скорее всего как службу.
Удаляться файлы будут при уменьшении свободного места на диске (по условиям задачи так предпочтительнее).

Что до способов сортировок, то ваши рекомендации могут в будущем пригодиться. Стандартный контейнер std::set, как я понял, до памяти жадный. Но для данной задачи можно обойтись сортировкой NTFS (другая ФС не предполагается).

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
27.05.2015, 10:31
    #38969488
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Frame RelayЧто до способов сортировок, то ваши рекомендации могут в будущем пригодиться. Стандартный контейнер std::set, как я понял, до памяти жадный.
Если задача сначала все прочитать, затем отсортировать, то быстрее (и меньше памяти) будет сначала все прочитать в обычный массив (или vector) и в конце его отсортировать.

set/map удобнее тем что после любого изменения набор остается сортированным, есть поиск, но плата за это меньшая скорость чтения/записи и доп.память для хранения порядка сортировки (плюс 50-100% к размеру данных).
...
Рейтинг: 0 / 0
27.05.2015, 11:27
    #38969561
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Дима, учитывая embedded-решение я-бы вообще не расчитывал на то что будет доступна
вообще какая-то память. Она может быть и она может быть отдана в распоряжение
основной задаче.
...
Рейтинг: 0 / 0
27.05.2015, 12:46
    #38969675
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
mayton,

ну, вообще есть и внешняя сортировка.
Я даже кодом могу поделится.
...
Рейтинг: 0 / 0
27.05.2015, 14:52
    #38969838
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
Спасибо не надо.
...
Рейтинг: 0 / 0
27.05.2015, 19:54
    #38970166
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отсортированный по алфавиту список файлов в каталоге на NTFS
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отсортированный по алфавиту список файлов в каталоге на NTFS / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]