Получение списка файлов в установленном порядке

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 4 авг 2007.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Добрый день.
    Пытаюсь получить список файлов, находящихся в определенной папке. Для этого использую FindFirstFile и FindNextFile. Но они возвращают имена в каком-то отфанарном порядке. Я хочу получать файлы в том порядке, в котором я их в последний раз оставлял в папке, как, например, делает стандартная программа просмотра изображений. Попытался посмотреть ее импорт (решил, что нужно посмотреть в импорт shimgvw.dll. Если неправильно, то поправьте пожалуйста), но там и намека на FindFirstFile, FindNextFile нету.
    Ну и вопрос в том, как же все-таки получить файлы именно в том порядке, в котором они расположены в окне папки.
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Исправлено. За прошлый пост - извиняй. Погорячился.
    И так.

    Во первых, а с чего ты взял, что этому модулю нужно что-то такое импортировать??
    Вполне возможно, что не он отвечает за получение списка файлов.
    Во-вторых - знаешь, что такое динамический импорт??
    Т.е. когда указатель на функцию получают через LoadLibraryA/GetProcAddress
    Может быть как раз твой случай. Если в импорте нет и этих функций - значит пункт 1 верный. Модуль не тот.


    Теперь к вайлам.
    FindFirstFile / FindNextFile просто бороздят буффер, полученный системным сервисом ZwQueryDirectory. Имена файлов АПИ вернут по дате создания. Если хочешь какого-то порядка - сортируй ручками по любому критерию - на твой выбор... Будь то имена файлов или дата создания/последнего доступа.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    FindNextFile возвращает не в отфонарном порядке, а в порядке даты создания файла.
    Если нужно в том порядке, как они наблюдаются в окне эксплорера - сортируй полученый список.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nitrotoluol
    Хм... весело. Раньше мне еще так не отвечали. Боюсь, что после пункта три перейти к пункту четыре будет затруднительно.
    cresta
    На основе чего сортировать? И еще... почему shimgvw.dll не импортирует FindFirstFile, FindNextFile?
     
  5. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    перенесено в пост 2
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Потому, что это и есть программа просмотра изображений. А она обязана получать список файлов, чтобы между ними переключаться можно было, когда просматриваешь изображения.
    Не вижу смысла в том, что прога дофигищу функций из kernel32 импортирует, а только для FindFirstFile, FindNextFile и FindClose GetProcAddress использует. Если бы я среди только двух-трех функций импорта GetProcAddress обнаружил, то я бы и о динамическом импорте подумал.

    Теперь насчет сортировки. На основе каких данных мне их сортировать, если они в окне эксплорера расположены так, как я их там расположил, а не отсортированными по именам, например?

    ---------
    nitrotoluol
    По вашему отредактированному посту:
    Вообще LoadLibraryA не нужен для FindFirstFile и подобных, так как я не представляю, как процесс сможет вообще загрузиться без kernel32, в котором они находятся.
     
  7. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    l_inc
    Я сказал лишь об общем случае динамического импорта. С кернелом разумнее юзать GetModuleHandleA

    Это длл-ка, юзаемая explorer-ом и пр., на которых как раз и лежит задача получить список файлов. Т.е. список получается где-то вне модуля.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    nitrotoluol
    Это Вы про shimgvw.dll? Хм... Вообще программа просмотра изображений запускается строкой:
    rundll32.exe C:\Windows\system32\shimgvw.dll,ImageView_Fullscreen [имя файла, который пытаются открыть]
    Поэтому смею предположить, что это все-таки основной модуль (хотя я даже еще на точку входа не смотрел), а еще потому, что она импортирует кучу функций из gdiplus, и, думаю, именно shimgvw.dll должна получать список файлов. Но раз я не нахожу FindFirstFile и иже с ними, то наверняка ошибаюсь. Так что поправьте, если что.
    А насчет "юзаемая explorer-ом", то думаю, что, например, для предварительного просмотра картинок окнах explorer'а.
    Но это не главное. Главное: получить список файлов в нужном порядке, а наличие FindFirstFile в импорте меня не настолько волнует. Так что там насчет предложения о сортировке? Вы его так и не уточнили.
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    На основе чего сортировать?

    На основе любого алгоритма сортировки, хоть пузырьком, хоть quicksort, хоть любой другой алгоритм.
    У тебя есть массив строк (имен файлов) - вот и сортируй его.
    Если сам не сможешь написать алгоритм (хотя пузырьком - очень просто), то в std есть реализация qSort.
    Или поищи готовые алгоритмы. На http://algolist.manual.ru посмотри.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    cresta
    Очень смешно. А то я их отсортировать не могу. Мне не нужен сортированный список файлов. Мне нужен список файлов в таком порядке, в котором он отображается в окне эксплорера (а файлы там могут быть и не сортированы).
    И прочитайте, пожалуйста, пост шесть, а то, если я буду так много повторяться, объясняя проблему, то эта тема на десять страниц разлезется.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    nitrotoluol
    На NTFS - точно нет. Т.к. там B-Tree уже сбалансированно по алфавиту и имена возвращаются именно в этом порядке (учёт регистра символов зависит от настроек драйвера фс).

    l_inc
    А он если и не сортирует по умолчанию, то отображает в порядке, возвращаемым ему IShellFolder::EnumObjects (а-ля Find*File + иные шелл-объекты, если есть).
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Очень смешно. А то я их отсортировать не могу. Мне не нужен сортированный список файлов. Мне нужен список файлов в таком порядке, в котором он отображается в окне эксплорера (а файлы там могут быть и не сортированы).

    Интересно, как тебе этого удалось добиться?
    У меня ВСЕГДА файлы при открытии окна эксплорера в алфавитном порядке.
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Кстати, тебе не приходила мысль, что та тулза, на которую ты постоянно ссылаешься, берет список файлов не с винта, а из своего внутреннего списка, типа recent files, который обычно содержит файлы в порядке их создания/открытия ? Потому и порядок файлов произвольный (не по алфавиту).
    По этой же причине findfirst/findnextfiles могут отсутствовать в импорте проги. Ибо они для чтения списка recent files не нужны.
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    cresta
    Хм... правой кнопкой мыши на пустое место в окне эксплорера --> упорядочить значки --> автоматически. Кроме того, даже не снимая эту птичку, возьмите и перетащите в окне эксплорера значок любого файла между значками других файлов. Порядок файлов от этого разве не изменится?
    IceStudent
    Большое спасибо. Наконец-то получил приличный ответ. Сейчас проверяю, не вернет ли мне IShellFolder::EnumObjects файлы в том же порядке, что и Find*File.
    А то, если на этом форуме не мелькаешь, отвечая каждому второму на вопросы, то по умолчанию считаешься тупым ламером (хотя я ведь не в разделе kernel тему создавал... раздел для новичков все-таки) и получаешь ответы в духе "убейся ап стену" или, ЧТО ЕЩЕ ОБИДНЕЕ, предлагают сортировку Хоора с чужих исходников списывать.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    cresta
    Порядок файлов там не произвольный, а именно такой, который отображен в окне эксплорера!!! Даже если я перетащу один значок внутри окна эксплорера между двумя другими, то ТУЛЗА будет показывать изображения в новом порядке. И эта ТУЛЗА называется "Программа просмотра изображений и факсов" - стандартное приложение виндовс, о котором можно не знать только если всю жизнь в юниксе просидел.
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Как вариант:

    После открытия папки в эксплорере (режим просмотра "Эскизы страниц", "Плитка" или "Значки") файлы были перемещены внутри окна путём перетаскивания мышью (или были созданы новые файлы), т.е. было нарушено первоначальное взаиморасположение иконок файлов. Как получить список файлов в соответствии с их новым взаиморасположением?

    Если бы ты задал вопрос примерно в таком виде, то шибко горячие головы не советовали бы тебе "убейся ап стену". И ответ на свой вопрос получил бы значительно быстрее, без кучи препирательств и уточнений.

    Я например использую только вид отображения файлов "Список", в котором переместить файлы в произвольном порядке невозможно. Соответственно и ответил тебе применительно к такому виду отображения. Если тебе нужно было другое - задавай вопрос точно.
    Ибо кто-то умный сказал: правильно сформулированный вопрос - половина ответа.
     
  17. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Запускается ли библиотека без запуска эксплорера? Если нет, то могу предположить, что библиотеке просто передается от него информация о порядке и т.п.
    А где вообще он хранит порядок файлов?
     
  18. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Похоже как-то она с эксплорером взаимодействует. Если запустить из окна експлорера, то просмотр идёт в том порядке, в каком файлы находятся эксплорером. Если запускать не из эксплорера, то отсортированы по именам. Если прибить эксплорер - то всё запускается, но сортировка так же по именам.
    Кстати, IrfanView в любом случае возвращает отсортироваными по имени.

    з.ы. Про формулировку вопроса согласен с cresta
    з.ы.ы. Не особо полезная фича, помоему.
     
  19. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    оффтоп.
    В эксплоере другой вид использовать, помоему вообще дико...
    l_inc А к чему все это? В смысле, зачем тебе именно тот порядок?
    З.Ы. Может, мне тоже нужно будет...
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    cresta
    Здесь Вы правы. Можно было бы и поконкретнее, хотя ИМХО вопрос был задан в самом начале абсолютно однозначно, т.к. говорить
    имеет смысл только тогда, когда я их могу в произвольном порядке оставлять.
    asd
    Мало того: если запускать ИЗ ЭКСПЛОРЕРА с помощью "открыть с помощью", то изображения у меня также отсортированы по именам, и при этом появляется процесс rundll32.exe. А если запускать двойным щелчком, то процесс rundll32.exe не появляется. Т.е. смею предположить, что shimgvw.dll выполняется тогда в адресном пространстве эксплорера.
    Aspire
    Ну тут "на вкус и цвет". Мне больше всего нравится вид "значки". А "список" и в каком-нибудь Total Commander'е можно получить.
    Да так... Для интереса. Теперь уже не буду, т.к. взаимодействие с Explorer'ом меня пока не интересует.
    P.S. Всем большое спасибо.
    P.P.S. Кстати shimgvw.dll импортирует шелловские функции для получения списка файлов и информации о них. Так что еще раз спасибо IceStudent за идею.