| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Порядок файлов в ФС |
| Автор: MetalFan 23.4.2012, 00:09 | ||
| Всем доброго времени суток. Возник вопрос: как изменить порядок следования фалов в файловой системе в одном каталоге. Предыстория: Есть некоторые mp3 плееры, которые умеют воспроизводить контент папки только в той последовательности, в которой файлы были записаны в эту папку без какой-либо сортировки по названию файла. Задача: написать функцию/программу, которая будет уметь отсортировать файлы физически в заданной папке по имени или в случайном порядке... Придуман следующий алгортим (пока для "перемешивания" файлов в папке):
Алгоритм на 99.99% срабатывает только в том случае, если происходит перенос с переименованием файла с учетом НПП в имени файла. Т.е. порядок копирования учитывается только для FAT, для NTFS похоже существует некий свой алгоритм сортировки "по умолчанию"... Опытные люди, просветите, прав ли я в том, что порядок копирования имеет значение только для FAT(32)? Пример кода, реализующего алгоритм (DXE):
Код является "вытяжкой" из класса-потока и использует самописную функцию-обертку над SHFileOperation (CU_ShFlOp). |
| Автор: MetalFan 24.4.2012, 06:18 |
| Keeper89, ну да... вот такие они загадочные. Такой порядок файлов, к примеру, показывает тотал коммандер, когда выбрана сортировка "Без сортировки". Т.е. для FAT это порой "в перемешку", и на деле в том порядке, в каком в эту папку были скопированы/перенесены файлы. И самая засада слушать аудиокниги, которые "нечаянно" были записаны таким образом. То 2 глава 5й части, а следом 10 глава 2 части... |
| Автор: Keeper89 24.4.2012, 11:01 |
| А что если не копировать файлы в новую папку, а побайтно читать и писать в новый? После, старый удалить. |
| Автор: Qu1nt 24.4.2012, 12:44 | ||
MetalFan, уверен, что ты это видел, но все-таки:
|
| Автор: MetalFan 24.4.2012, 14:21 | ||
Да вот как раз имею парочку дешевых китайских плееров из второй половины, которые читают файлы в том порядке, в каком они есть. Плеер на столько примитивен, что имеет только три кнопки и 6 функций: плей/пауз/некст/прев/громче/тише. И не умеет, зараза, читать файлы ни рандомно ни по алфавиту. Вот и заморочился такой программкой. А читать/писать файлы по-байтам, имхо, еще более накладно, чем как сейчас сделано. Папку в 4Гб и почти 400 файлов алгортим обрабатывает не дольше 2-3х минут. В идеале было бы вызывать какую-нибудь "хитрую" системную функцию, которая отсортирует/перемешает файлы физически так, как надо без доп.переноса в другую папку.... Qu1nt, Представь себе, если и читал, то совершенно из головы вылетело. Хотя я к такому же заключению и так пришел экспериментально... |
| Автор: Keeper89 24.4.2012, 16:52 |
MetalFan, посмотри вот это
|
| Автор: MetalFan 25.4.2012, 12:30 |
| Keeper89, ой спасибо... особенно за первую ссылку. я что-то сам не додумался погуглить... Попробую реализовать то же самое под делфю... |
| Автор: Keeper89 25.4.2012, 13:38 |
| MetalFan, а зачем реализовывать если там уже есть готовое? Это часть какой-то утилиты? |
| Автор: MetalFan 25.4.2012, 13:49 |
| Keeper89, да понятно, что реализовано, но на сях... а хочется свою утилиту и на делфе) И более продвинутую... |
| Автор: Чучмек 28.4.2012, 23:51 |
Особо не вчитывался, но думаю логика совпадает - переставить местами заголовки файлов. Когда то писал нечто подобное, только менял местами заголовки разделов. А для файлов/каталогов - делал просто читалку(должна была выводить список файлов). Могу поискать код. |
| Автор: MetalFan 29.4.2012, 09:11 |
| Ну если будет время и вдруг найдется код, то я конечно же буду не против на него посмотреть) |
| Автор: Чучмек 6.5.2012, 21:16 | ||
| Найти - нашел. Зае...ся переводить в читаемый вид. А еще застопорился на http://forum.vingrad.ru/forum/topic-351410.html - пока нашел в чем дело... - (часть каталогов открывалась, а часть нет) уже дошло до того что начал искать FAT сжатие.
Для сохранения отсортированного каталога в TFATclass1 нужно добавить добавил простую функцию SaveSortedFolder принимающую в качестве параметра TFileHeader TContentFATFolder |
| Автор: MetalFan 9.5.2012, 20:50 |
| Чучмек, ого, спасибо, покурю на досуге. Это полностью самописное или откуда-то выбранное? |
| Автор: Чучмек 9.5.2012, 22:00 |
| Только с описания FAT. Сохранение каталога нужно переписать. Свободное место в каталоге нужно забивать нулями до конца, а не ограничиваться одной завершающей записью. |
| Автор: Чучмек 10.5.2012, 03:41 | ||||
Вот переписал
Нашел еще один бок - Если у файла без LFN контрольная сумма равна 0,то поле FileName структуры TFileHeader не заполняется, поскольку SFN такого файла воспринимается как завершение цепочки LFN
sum=0, а n и Chksum у вновь добавленного элемента массива FileHeaders могут содержать все что угодно, и очень даже вероятно что ноль. Unit во вложении заменил на исправленный. |