Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Delphi - Система _ Сортировка файлов

Автор: destroy 27:04:2008, 13:39

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


Автор: sax_ol 28:04:2008, 05:44

Написать соответствующий код, или нет?

Автор: destroy 28:04:2008, 10:39

Получаю список файлов так:

Код
procedure FindFilesByMask(List :tStrings; var DirCount :Integer; const DirName, Mask :String; SubDir: Boolean = True);

  procedure ScanDirs(const DirName :String);
  var
    h   :tHandle;
    wfd :tWin32FindData;
    sfo :string;
    n :integer;
    SearchRec2 :TSearchRec;
    


  begin
    Inc(DirCount);

    h := Windows.FindFirstFile(PChar(DirName+Mask), wfd);

    end;

    try
      if  h <> INVALID_HANDLE_VALUE  then begin
        repeat
          if  (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0  then
            List.Add(DirName+wfd.cFileName);
        until  not Windows.FindNextFile(h,wfd);
      end;

      case  GetLastError  of
        ERROR_NO_MORE_FILES,    // больше нет файлов и каталогов удовлетворяющих маске (но были)
        ERROR_FILE_NOT_FOUND,   // вообще нет файлов и каталогов удовлетворяющих маске
        ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
                              :; // ничего не делаем, все Ok
        else // все остальные ошибки
          raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
      end;
    finally
      if  h <> INVALID_HANDLE_VALUE  then Windows.FindClose(h);
    end;

    // Теперь рекрсивно просмотрим подкаталоги
    if not SubDir then exit;
    h := Windows.FindFirstFile(PChar(DirName+'*.*'), wfd);
    try
      if  h <> INVALID_HANDLE_VALUE  then begin
      
        repeat
          if   ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0)
           and (wfd.cFileName <> String('.'))
           and (wfd.cFileName <> '..')           then
            ScanDirs(IncludeTrailingPathDelimiter(DirName+wfd.cFileName));
        until  not Windows.FindNextFile(h,wfd);
      end;

      case  GetLastError  of
        ERROR_NO_MORE_FILES,    // больше нет файлов и каталогов удовлетворяющих маске (но были)
        ERROR_FILE_NOT_FOUND,   // вообще нет файлов и каталогов удовлетворяющих маске
        ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
                              :; // ничего не делаем, все Ok
        else // все остальные ошибки
          raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
      end;
    finally
      if  h <> INVALID_HANDLE_VALUE  then Windows.FindClose(h);
    end;
  end;

begin // FindFilesByMask
  ScanDirs(IncludeTrailingPathDelimiter(DirName));
end;


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

Автор: sax_ol 28:04:2008, 11:28

Закидывайте данные в TStringList, его сорттируйте, а на выходе Assign в destination. Так вот первое что пришло.

Автор: destroy 28:04:2008, 14:00

sax_ol, я так тоже делал.

Но все ни так просто у меня.
Код который я привел не совсем полный так сказать...

Принцип такой:
Если найдена папка, название ее добавляется в memo
И после того как все имена файлов, которые находятся в этой папке добавлены в memo,
добавляется опять строчка с название этой папки.

Например:

video
c:\video\1.avi
c:\video\2.avi
c:\video\3.avi
video

music
c:\music\1.mp3
c:\music\2.mp3
...

А когда я закидываю в TStringList
у меня есессно все сбивается.

Думал может есть какая ф-я для сортировки при поиске файлов...

Автор: sax_ol 28:04:2008, 14:15

Почему m позже v ?

Автор: destroy 28:04:2008, 14:38

Цитата
Почему m позже v ?

Да это я так для примера привел.

Автор: sax_ol 28:04:2008, 15:05

Вы для примера (неправильного), условия меняете от топика к топику, а люди при этом думают, стараются помочь ... оч. некрасиво.

Автор: destroy 28:04:2008, 15:13

да я просто пример привел как я получаю список файлов.
Тоесть в начале название папки потом файлы потом опять название папки.
и вопрос просто как отсортировать все это и чтобы сохранилась структура.

Это Вы что то путаете.

Автор: sax_ol 28:04:2008, 15:41

Цитата(destroy @ 28:04:2008 - 17:13) *
Это Вы что то путаете.
Я ничего не путаю, я смотрю на первый пост и сравниваю с последующими, и вижу что условия меняются постоянно, а это не хорошо.
Надо вам учиться правильно формулировать вопросы: http://www.citforum.ru/howto/smart-questions-ru.shtml

Автор: destroy 28:04:2008, 16:07

Вопрос закрыт. Сделал.

Цитата
я смотрю на первый пост и сравниваю с последующими

читать надо, а не смотреть.

В 5 сообщение я расписал подробно что хотел.

Автор: sax_ol 28:04:2008, 16:40

Нафик читать всякую ерунду.

Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)