Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порядок файлов в ФС, Порядок файлов в файловой системе 
:(
    Опции темы
MetalFan
  Дата 23.4.2012, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Всем доброго времени суток.
Возник вопрос: как изменить порядок следования фалов в файловой системе в одном каталоге.

Предыстория: Есть некоторые mp3 плееры,  которые умеют воспроизводить контент папки только в той последовательности, в которой файлы были записаны в эту папку без какой-либо сортировки по названию файла.

Задача: написать функцию/программу, которая будет уметь отсортировать файлы физически в заданной папке по имени или в случайном порядке...

Придуман следующий алгортим (пока для "перемешивания" файлов в папке): 
  • получаем список файлов в заданной папке
  • "перемешиваем" его
  • переносим пофайлово во временную папку с (или без) присвоением каждому файлу префикса в виде №п/п(номера по-порядку) в перемешанном списке. 
  • Удаляем исходную(уже пустую) папку
  • Переименовываем временную папку в исходную
Все вроде как красиво... но. 
Алгоритм на 99.99% срабатывает только в том случае, если происходит перенос с переименованием файла с учетом  НПП в имени файла.
Т.е. порядок копирования учитывается только для FAT, для NTFS похоже существует некий свой алгоритм сортировки "по умолчанию"...
Опытные люди, просветите, прав ли я в том, что порядок копирования имеет значение только для FAT(32)?

Пример кода, реализующего алгоритм (DXE):
Код

var
  lFiles: TStringDynArray;
  i: Integer;
  lFN, lNewFN: string;
  lRnd: Integer;
  lTmpPath: string;
  lLen: Integer;
begin
  if FMask = '' then
    FMask := '*';
  lFiles := TDirectory.GetFiles(FPath, FMask, TSearchOption.soTopDirectoryOnly );
  lLen := Length(IntToStr(Length(lFiles)));
  for i := 0 to High(lFiles) do
  begin
    lRnd := Random( Length(lFiles) );
    lFN :=  ExtractFileName( lFiles[lRnd] );
    lFiles[lRnd] := ExtractFileName( lFiles[i] );
    lFiles[i] := lFN;
  end;
  TInterlocked.Exchange( FTotal, Length(lFiles));
  lTmpPath := ExcludeTrailingPathDelimiter(FPath)+'~tmp\';
  if not ForceDirectories(lTmpPath) then Exit;
  TInterlocked.Exchange( FProgress, 0);
  for i := 0 to High(lFiles) do
  begin
    lNewFN := lFiles[i];
    lNewFN := TRegEx.Replace( lNewFN, '^\d+\.\s+', '');
    if FInclNumber then
       lNewFN := Format('%.'+IntToStr(lLen)+'d. %s', [succ(i), lNewFN] );
    if Terminated then Break;
    MoveFileEx( PChar(FPath + lFiles[i]), PChar({FPath }lTmpPath + lNewFN),  MOVEFILE_WRITE_THROUGH or MOVEFILE_COPY_ALLOWED);
    TInterlocked.Exchange( FProgress, Succ(i));
  end;
  lTmpPath := ExcludeTrailingPathDelimiter(lTmpPath);
  FPath := ExcludeTrailingPathDelimiter(FPath);
  CU_ShFlOp(sfoDelete, [FPath], []);
  CU_ShFlOp(sfoRename, [lTmpPath], [FPath] );

Код является "вытяжкой" из класса-потока и использует самописную функцию-обертку над SHFileOperation (CU_ShFlOp).


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MetalFan
Дата 24.4.2012, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Keeper89, ну да... вот такие они загадочные. 
Такой порядок файлов, к примеру, показывает тотал коммандер, когда выбрана сортировка "Без сортировки". Т.е. для FAT это порой "в перемешку", и на деле в том порядке, в каком в эту папку были скопированы/перенесены файлы.
И самая засада слушать аудиокниги, которые "нечаянно" были записаны таким образом. То 2 глава 5й части, а следом 10 глава 2 части...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чучмек
Дата 24.4.2012, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



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

Цитата(MetalFan @  23.4.2012,  00:09 Найти цитируемый пост)
Предыстория: Есть некоторые mp3 плееры,  которые умеют воспроизводить контент папки только в той последовательности, в которой файлы были записаны в эту папку без какой-либо сортировки по названию файла.

Но половина из них все же сортируют файлы с короткими именами (8+3).
И на всех из них (почти?) FAT.



--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Keeper89
Дата 24.4.2012, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



А что если не копировать файлы в новую папку, а побайтно читать и писать в новый? После, старый удалить.


--------------------
PM MAIL WWW   Вверх
Qu1nt
Дата 24.4.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 5
Всего: 50



MetalFan, уверен, что ты это видел, но все-таки:
Цитата(FindNextFile function)

The order in which the search returns the files, such as alphabetical order, is not guaranteed, and is dependent on the file system. If the data must be sorted, the application must do the ordering after obtaining all the results.

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are usually returned in alphabetical order. With FAT file systems, the names are usually returned in the order the files were written to the disk, which may or may not be in alphabetical order. However, as stated previously, these behaviors are not guaranteed.

PM MAIL   Вверх
MetalFan
Дата 24.4.2012, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(Чучмек @  24.4.2012,  09:44 Найти цитируемый пост)
Но половина из них все же сортируют файлы с короткими именами (8+3).
И на всех из них (почти?) FAT.

Да вот как раз имею парочку дешевых китайских плееров из второй половины, которые читают файлы в том порядке, в каком они есть.
Плеер на столько примитивен, что имеет только три кнопки и 6 функций: плей/пауз/некст/прев/громче/тише. И не умеет, зараза, читать файлы ни рандомно ни по алфавиту.
Вот и заморочился такой программкой.
А читать/писать файлы по-байтам, имхо, еще более накладно, чем как сейчас сделано. Папку в 4Гб и почти 400 файлов алгортим обрабатывает не дольше 2-3х минут.

В идеале было бы вызывать какую-нибудь "хитрую" системную функцию, которая отсортирует/перемешает файлы физически так, как надо без доп.переноса в другую папку....


Qu1nt, Представь себе, если и читал, то совершенно из головы вылетело. 
Хотя я к такому же заключению и так пришел экспериментально...



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Keeper89
Дата 24.4.2012, 16:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



MetalFan, посмотри вот это

Это сообщение отредактировал(а) Keeper89 - 25.4.2012, 02:21


--------------------
PM MAIL WWW   Вверх
MetalFan
Дата 25.4.2012, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Keeper89
Дата 25.4.2012, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



MetalFan, а зачем реализовывать если там уже есть готовое? Это часть какой-то утилиты?


--------------------
PM MAIL WWW   Вверх
MetalFan
Дата 25.4.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Keeper89, да понятно, что реализовано, но на сях...
а хочется свою утилиту и на делфе) И более продвинутую...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чучмек
Дата 28.4.2012, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(Keeper89 @  24.4.2012,  16:52 Найти цитируемый пост)
http://www.codeproject.com/Articles/95721/FAT-32-Sorter

Особо не вчитывался, но думаю логика совпадает - переставить местами заголовки файлов.
Когда то писал нечто подобное, только менял местами заголовки разделов. А для файлов/каталогов - делал просто читалку(должна была выводить список файлов).
Могу поискать код.    


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
MetalFan
Дата 29.4.2012, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(Чучмек @  28.4.2012,  23:51 Найти цитируемый пост)
Могу поискать код.
 Ну если будет время и вдруг найдется код, то я конечно же буду не против на него посмотреть)



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чучмек
Дата 6.5.2012, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Найти - нашел. Зае...ся переводить в читаемый вид.
А еще застопорился на int64 - пока нашел в чем дело... - (часть каталогов открывалась, а часть нет) уже дошло до того что начал искать FAT сжатие.
Код

var fat:TFATclass1;

procedure TForm1.FormCreate(Sender: TObject);
begin
 fat:=TFATclass1.create;
 if cr_NoFAT = fat.assignDisk('L') then
   begin
   fat.destroy;
   application.Terminate;
   exit;
   end;
 TreeView1.Items.AddChild(TreeView1.Items.Add(nil,fat.DriveLetter+':\   '+fat.VolumeLabel),'').ImageIndex:=-1;
end;

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var
 fc:TContentFATFolder;
 fh:TFileHeader;
 tmpnode:TtReeNode;
 i,n:integer;
begin

  if ((NODE.Data<>nil)or(TreeView1.Items[0]=NODE))and(Node.GetNextChild(Node.getFirstChild)=nil)  then
   begin
   fc:=fat.getFolderContent(cardinal(NODE.Data));
   fc.Sort;
   if fc.isRootDirectory then n:=0 else n:=2;
   for i:=n to fc.FileCount-1 do
    begin
    fh:=fc.Files[i];
    tmpnode:=TreeView1.Items.AddChild(node,fh.FileName);
    tmpnode.Data:=pointer(fh.FATShortNameFileHeader.FirstClusterLow or (fh.FATShortNameFileHeader.FirstClusterHigh shl 16));
    if (fh.FATShortNameFileHeader.FileAttributes and cfa_Dir) =cfa_Dir then
      begin
      tmpnode.ImageIndex:=0;
      tmpnode.SelectedIndex:=0;
      with TreeView1.Items.AddChild(tmpnode,'')do
       begin
       ImageIndex:=-1;
       SelectedIndex:=-1;
       end;
      end   else with tmpnode do
                 begin
                 ImageIndex:=-1;
                 SelectedIndex:=-1;
                 end;
    end;
   fc.Destroy;
   end;



end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if fat<>nil then fat.Destroy;
end;

Для сохранения отсортированного каталога в TFATclass1 нужно добавить добавил простую функцию SaveSortedFolder принимающую в качестве параметра TFileHeader TContentFATFolder



Это сообщение отредактировал(а) Чучмек - 10.5.2012, 03:43

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Unit2.pas 23,40 Kb


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
MetalFan
Дата 9.5.2012, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Чучмек, ого, спасибо, покурю на досуге. Это полностью самописное или откуда-то выбранное?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Чучмек
Дата 9.5.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Только с описания FAT.
Сохранение каталога нужно переписать. Свободное место в каталоге нужно забивать нулями до конца, а не ограничиваться одной завершающей записью. 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.