WinInet: FtpFindFirstFile

Тема в разделе "WASM.NETWORKS", создана пользователем gevara, 9 мар 2007.

  1. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    требуется организовать поиск файлов по всем вложенным папкам на FTP. при пвторном вызове FtpFindFirstFile с одного соединения выходит ошибка ERROR_FTP_TRANSFER_IN_PROGRESS. Документация говорит, что хендл (возвращаемый ф-ей FtpFindFirstFile) должен быть закрыт. получается что для организации поиска файлов по вложенным папкам необходимо создавать кучу соединений? или есть другой выход?
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    gevara
    Нет, ты немножко не понял суть функции.
    Функция либо находит конкретно-заданный тобой файл, либо первый файл в заданной директории, соответствующий маске. Что-то типа FindFirstFile, только для FTP

    А рекурсия организовывается в цепочке:

    FtpFindFirstFile
    InternetFindNextFile
    InternetCloseHandle

    А вот описания функций:
    ------------------------------------------------------

    FtpFindFirstFile
    Код (Text):
    1. Searches the specified directory of the given FTP session. File and directory entries are returned to the application in the WIN32_FIND_DATA structure.
    2.  
    3. HINTERNET FtpFindFirstFile(
    4.   HINTERNET hConnect,
    5.   LPCTSTR lpszSearchFile,
    6.   LPWIN32_FIND_DATA lpFindFileData,
    7.   DWORD dwFlags,
    8.   DWORD_PTR dwContext
    9. );
    10.  
    11. Parameters
    12. hConnect
    13. [in] Handle to an FTP session returned from InternetConnect.
    14.  
    15. lpszSearchFile
    16. [in] Pointer to a null-terminated string that specifies a valid directory path or file name for the FTP server's file system.
    17. The string can contain wildcards, but no blank spaces are allowed. If the value of lpszSearchFile is NULL or if it is an empty
    18. string, the function finds the first file in the current directory on the server.
    19.  
    20. lpFindFileData
    21. [out] Pointer to a WIN32_FIND_DATA structure that receives information about the found file or directory.
    22.  
    23. dwFlags
    24. [in] Controls the behavior of this function. This parameter can be a combination of the following values.
    25. INTERNET_FLAG_HYPERLINK
    26. INTERNET_FLAG_NEED_FILE
    27. INTERNET_FLAG_NO_CACHE_WRITE
    28. INTERNET_FLAG_RELOAD
    29. INTERNET_FLAG_RESYNCHRONIZE
    30.  
    31. dwContext
    32. [in] Pointer to a variable that specifies the application-defined value that associates this search with any application data.
    33. This parameter is used only if the application has already called InternetSetStatusCallback to set up a status callback
    34. function.
    35.  
    36. Return Values
    37. Returns a valid handle for the request if the directory enumeration was started successfully, or returns NULL otherwise
    InternetFindNextFile
    Код (Text):
    1. Continues a file search started as a result of a previous call to FtpFindFirstFile or GopherFindFirstFile.
    2.  
    3. BOOL InternetFindNextFile(
    4.   HINTERNET hFind,
    5.   LPVOID lpvFindData
    6. );
    7.  
    8. Parameters
    9. hFind
    10. [in] Handle returned from either FtpFindFirstFile, GopherFindFirstFile, or InternetOpenUrl (directories only).
    11. lpvFindData
    12. [out] Pointer to the buffer that receives information about the file or directory. The format of the information placed in the buffer depends on the protocol in use. The FTP protocol returns a WIN32_FIND_DATA structure
    13. Return Values
    14. Returns TRUE if the function succeeds, or FALSE otherwise.
    InternetCloseHandle
    Код (Text):
    1. Closes a single Internet handle.
    2. BOOL InternetCloseHandle(
    3.   HINTERNET hInternet
    4. );
    5.  
    6. Parameters
    7. hInternet
    8. [in] Handle to be closed.
    9. Return Values
    10. Returns TRUE if the handle is successfully closed, or FALSE otherwise.
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Еще момент. Если фтп - публичный, то есть смысл искать не самостоятельно, а через фтп-шные поисковые машины. Это как-правило на порядок быстрее и менее палевнее.
     
  4. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    И ще момент. Если ищешь файлы по одной маске, то смысла в нескольких соединениях никакого. Скорость поиска только замедлится. А вот если искать файлы разных типов, к примеру одно соединение ищет БМП, другое ЖПГ, третье ЖИФ, а четвертое ЕХЕ файлы, то можно добиться значительного прироста в скорости.
     
  5. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    Нет, ты немножко не понял суть функции.
    Функция либо находит конкретно-заданный тобой файл, либо первый файл в заданной директории, соответствующий маске. Что-то типа FindFirstFile, только для FTP


    Это я понял. вот только написать что-то типа:

    hOpen = InternetOpen(0);
    hConnect = InternetConnect(hOpen,...);

    FtpFindFirstFile(hConnect,"/*.exe",&wfd,0,0);
    FtpFindFirstFile(hConnect,"/*.",&wfd,0,0);
    GetLastError(); // 2EE0

    не получится. то есть если первая функция сработала удачно - нашла файл, вернула хендл, то при втором вызове она завершится ошибкой ERROR_FTP_TRANSFER_IN_PROGRESS. то есть между ними нужно ставить InternetCloseHandle. но ведь при поиске по вложенным папкам требуется одновременно открывать несколько хендлов (по одному для каждой вложенной папки), а это (как я понимаю) возможно только с нескольких соединений. если есть ссылки на проги, организующие такой поиск или исходники - буду оч благодарен.
     
  6. nitrotoluol

    nitrotoluol New Member

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

    Вот только рекурсию, подобную той, которая используется при поиске на жестком диске, - на тцп не прикрутить.. Сам принцип тцп не позволит в одно соединение организовать рекурсивный поиск...
    Как вариант - это работа со списками (именно этот принцип заюзан в тотале), но ресурсы жрать будет прилично...
     
  7. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    мда.. такой вариант не прокатит.. есть ещё возможные варианты?
     
  8. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    В одно соединение - врятли...
     
  9. gevara

    gevara максим

    Публикаций:
    0
    Регистрация:
    10 ноя 2006
    Сообщения:
    112
    Адрес:
    г. Пермь
    выкладываю сорцы и екзешник для поиска файлов на ФТП. создаёт кучу коннектов. мне это очень не нравится. хочу услышать выше мнение.

    ищет файлы на far сервере. об оптимизации не заботился. тестовый вариант.
     
  10. coba

    coba New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2002
    Сообщения:
    11
    Адрес:
    Ukraine
    попробуй слать ascii команды через сокеты

    поищи тут
    http://www.codeproject.com/internet/ftpclientclass.asp