Помогите разобраться с функциями FindFirstFile и FindNextFile!

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 8 ноя 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! То есть надо перечислить файлы, находящиеся в подкаталоге.
    Делаем так:

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. int main(){
    5.  
    6.  WIN32_FIND_DATA FILEDATA;
    7.  
    8.  HANDLE hFile = FindFirstFile("C:\\proba\\*.*",&FILEDATA);
    9.  printf("%s\n", FILEDATA.cFileName);
    10.  
    11.  FindNextFile(hFile,&FILEDATA);
    12.  printf("%s\n", FILEDATA.cFileName);
    13.  
    14.  FindNextFile(hFile,&FILEDATA);
    15.  printf("%s\n", FILEDATA.cFileName);
    16.  getchar ();
    17.  return 0;
    18. }
    Начнается корректное перечисление. То есть первым получается файл ".", потом файл "..", потом какой там по факту будет.
    Мне вот что непонятно.
    Вот этим кодом
    Код (Text):
    1. FindFirstFile("C:\\proba\\*.*",&FILEDATA);
    Мы определяем первый файл. Какой он я не знаю, но система его определяет как точка. Это ладно. Пока я в это не вникаю, мне важно другое.

    Почему первый файл нельзя определить так?
    Код (Text):
    1. FindFirstFile("C:\\proba\\ima_fala.txt",&FILEDATA);
    То есть я говорю системе: первый файл это файл ima_fala.txt, а при дальнейших вызовах FindNextFile ты сама определяй какие файлы последующие.
    Но так не получается почему-то. Если имя первого файла задавать самому, то все последующие вызовы FindNextFile "видят" исключительно этот файл и только его имя и выводят.

    Почему так? Ведь мы сами вправе определить,какой файл считать первым? Получается, не так. Получается, чтобы получить перечень файлов надо писать *.* Странно, здесь, например, об этом ничего не сказано.
    http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_findfirstfile.htm

    ...Так-то со сдуванием кода из интернета проблем нет, но хотелось бы разобраться.
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Че-то я не понял, что тебя удивляет.
    FindFirstFile() первым параметром принимает маску имени файла. Маске "C:\\proba\\ima_fala.txt", соответствует только сам этот файл (если он вообще есть).
     
  3. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    Так ты его определил, он тебе его нашёл. Какой может быть дальше, если каждый файл имеет уникальное имя. В одном каталоге может бцть только одно уникальное имя!

    Читай MSDN.
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Маску файла?

    Вот уж никогда бы не подумал. По приведённой мной ссылке этого нет. Вернее сказано как-то расплывчато: можно имя писать, можно *

    Но дело даже не в этом. Так ведь не запрещено определять первый файл?
    Код (Text):
    1. FindFirstFile("C:\\proba\\ima_fala.txt",&FILEDATA);
    Нет, на запрещено. (Допускаем, что он существует)
    А последующие что же нормально не определяются?
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    MSDN это, конечно, наше всё... Но есть ведь и русскоязычные источники?
    http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_findnextfile.htm
    "Функция FindNextFile продолжает поиск файла из предыдущего вызова функции FindFirstFile или FindFirstFileEx"

    И не оговорено, как именно, должна быть вызвана функция FindFirstFile! Просо сказано- она должна быть вызвана, ну и понятно, коректно найти первый файл. А FindNextFile найдёт последующие.

    Не ищет.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    А вообще вот
    http://msdn.microsoft.com/en-us/library/ee490628.aspx

    Не сказано там, КАК ИМЕННО должна быть вызвана FindFirstFile
    Просто сказано
    "This function continues a file search from a previous call to the FindFirstFile or the FindFirstFileEx function."

    Ну, о есть чего-то там заполняет из предыдущего вызова FindFirstFile. Всё.
     
  7. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    т.с. жирный тролль
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Сам ты тролль
     
  9. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    amvoz читай внимательно http://msdn.microsoft.com/en-us/library/ee489744.aspx
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Вот, трудно перевести одно-два ключевых предложения?

    Речь FindNextFile

    А то, что FindFirsttFile должна да не обязана принимать аргумент, оканчивающийся на звёздочку, я и так вижу.
    Не знаете, так не пишите зря. Сам разберусь.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Не видно неотвеченных вопросов.
    MSDN - официальнная документация.
    А какой-то сайт на народе свосем не авторитет.
    Если на заборе будет написано "FindFirstFile() - не существует.", этому тоже верить?
     
  12. Mankubus

    Mankubus New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2009
    Сообщения:
    76
    amvoz Вы прикидываетесь, или вам и правда непонятно, что FindFirstFile принимает первым параметром путь с маской? Уже же все разжевали вам. Про то, что этот параметр якобы первый файл, вы сами себе в голову вбили. Если вам кажется, что маска "*.*" имеет какое-то отношение к каталогу ".", который в поиске первый, вы ошибаетесь. Читайте MSDN, вникайте мозгом в прочитанное и не спрашивайте лажу всякую.
     
  13. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    ТС наркоман.
    FindFirstFile ищет первый файл, соответствующий маске, FindNextFile следующий, соответствующий маске.
    Т.е. при маске * это все файлы (не спрашивай, почему), маска *.txt, скажем - текстовики, и так далее.
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Нет там.
    Я закалустался пыль глотать по интернету бегать

    Мне единственное, что надо было, это вот это:
    http://forum.sources.ru/index.php?showtopic=39461

    Вот тут написано:
    FindFirst - ищет первый файл, отвечающий критериям поиска
    FindNext - ищет следующий(ие) файл(ы)

    Вот так. То, что FindNext ищет следующие файлы, отвечающие критериям поиска никто не написал.
    То есть я не вижу в ответах такой фразы. Тупо. Аналогию с FindNextFile уж сам провёл

    То есть все твердят пр маску и про FindFirstFile.
    Я русским языком сказал:
    Я понял, что принимает FindFirstFile. И про маску я вот здесь прочёл:
    http://api.farmanager.com/ru/filemasks.html

    И я понял, что если написано *.*, то FindFirstFile будет искать ЛЮБОЙ файл или директорию. Но я про это не спрашивал, я третий раз вам говорю, я не спрашивал про FindFirstFile начиная с 10-го сообщения по крайней мере. А вы пишите в 12-ом:
    То ли я дурак, то ли что.
    Непонятен вопрос- перспросите лучше или промолчите.

    Последний оратор только понял, что мне надо и чёрным по-белому написал:
    Но он тоже поддался стадному чувству и меня оскорбил

    Всё. Если кто-то ткнёт меня носом в то, что мне и раньше о этом писали
    FindNext ищет следующие файлы, отвечающие критериям поиска, я навсегда уйду с форума.
    Если бы слова были в другом порядке. я бы не обиделся.

    Я понимаю вы тут все прогаммёры крутые. Но это же не даёт вам морального права не разбираться в вопросе. И лезть.
    Ещё раз: непонятен вопрос- скажи: ты amvoz, косноязычный. Нет же, охота время тратить выпендриваться...
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    n0name, тысказал, что не видно неотвеченных вопросов.
    Где кто кроме последнего оратора сказал, что
    "FindNext ищет следующие файлы, отвечающие критериям поиска"
     
  16. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Повторяем-с для особо непонятливых.

    !!!!!!
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    dyn ты что придуриваешься?
    Разницу секёшь между FindFirstFile и FindNextFile?

    Ты пишешь о FindFirstFile, а я спрашиваю о FindNextFile
    То ли я дурак то ли почему...
     
  18. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    За что тебя уважать?
    Сделай, милость...
    Я, например, г**но с замашками на знание языков.
    Лично я считаю, что это очевидно и логично. Однако, перекомпилировать сорец два раза с разной маской и посмотреть вывод, имхо, быстрее, чем отстаивать свою придуманную проблему на форуме.
    Такие дела.
    Best regards, your ClearEnergy ^_^
     
  19. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Ну если серьезно, и особо не вдаваясь в подробности, то
    При FindFirstFile
    1. формируется список подходящих файлов
    2. Устанавливает указатель на начало списка
    3. Возвращается результат (структуру WIN32_FIND_DATA)

    При FindNextFile
    Ничего нигде не ищется
    1. Передвигается указатель на следующее поле в списке
    2. Вовзращается результат

    Сечешь разницу?
    Условия поиска задаешь в FindFirstFile. А FindNextFile служит лишь для того, чтобы облегчить тебе пробег по списку.
     
  20. Mankubus

    Mankubus New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2009
    Сообщения:
    76
    FindFirstFile

    FindNextFile

    Так что чего-чего у вас нет, так это того, чем другие это нашли и поняли.
    Остальные ваши слова без комментариев. Надеюсь, dyn все понятно наконец-то сказал. Удачи.