требуется организовать поиск файлов по всем вложенным папкам на FTP. при пвторном вызове FtpFindFirstFile с одного соединения выходит ошибка ERROR_FTP_TRANSFER_IN_PROGRESS. Документация говорит, что хендл (возвращаемый ф-ей FtpFindFirstFile) должен быть закрыт. получается что для организации поиска файлов по вложенным папкам необходимо создавать кучу соединений? или есть другой выход?
gevara Нет, ты немножко не понял суть функции. Функция либо находит конкретно-заданный тобой файл, либо первый файл в заданной директории, соответствующий маске. Что-то типа FindFirstFile, только для FTP А рекурсия организовывается в цепочке: FtpFindFirstFile InternetFindNextFile InternetCloseHandle А вот описания функций: ------------------------------------------------------ FtpFindFirstFile Код (Text): Searches the specified directory of the given FTP session. File and directory entries are returned to the application in the WIN32_FIND_DATA structure. HINTERNET FtpFindFirstFile( HINTERNET hConnect, LPCTSTR lpszSearchFile, LPWIN32_FIND_DATA lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext ); Parameters hConnect [in] Handle to an FTP session returned from InternetConnect. lpszSearchFile [in] Pointer to a null-terminated string that specifies a valid directory path or file name for the FTP server's file system. The string can contain wildcards, but no blank spaces are allowed. If the value of lpszSearchFile is NULL or if it is an empty string, the function finds the first file in the current directory on the server. lpFindFileData [out] Pointer to a WIN32_FIND_DATA structure that receives information about the found file or directory. dwFlags [in] Controls the behavior of this function. This parameter can be a combination of the following values. INTERNET_FLAG_HYPERLINK INTERNET_FLAG_NEED_FILE INTERNET_FLAG_NO_CACHE_WRITE INTERNET_FLAG_RELOAD INTERNET_FLAG_RESYNCHRONIZE dwContext [in] Pointer to a variable that specifies the application-defined value that associates this search with any application data. This parameter is used only if the application has already called InternetSetStatusCallback to set up a status callback function. Return Values Returns a valid handle for the request if the directory enumeration was started successfully, or returns NULL otherwise InternetFindNextFile Код (Text): Continues a file search started as a result of a previous call to FtpFindFirstFile or GopherFindFirstFile. BOOL InternetFindNextFile( HINTERNET hFind, LPVOID lpvFindData ); Parameters hFind [in] Handle returned from either FtpFindFirstFile, GopherFindFirstFile, or InternetOpenUrl (directories only). lpvFindData [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 Return Values Returns TRUE if the function succeeds, or FALSE otherwise. InternetCloseHandle Код (Text): Closes a single Internet handle. BOOL InternetCloseHandle( HINTERNET hInternet ); Parameters hInternet [in] Handle to be closed. Return Values Returns TRUE if the handle is successfully closed, or FALSE otherwise.
Еще момент. Если фтп - публичный, то есть смысл искать не самостоятельно, а через фтп-шные поисковые машины. Это как-правило на порядок быстрее и менее палевнее.
И ще момент. Если ищешь файлы по одной маске, то смысла в нескольких соединениях никакого. Скорость поиска только замедлится. А вот если искать файлы разных типов, к примеру одно соединение ищет БМП, другое ЖПГ, третье ЖИФ, а четвертое ЕХЕ файлы, то можно добиться значительного прироста в скорости.
Нет, ты немножко не понял суть функции. Функция либо находит конкретно-заданный тобой файл, либо первый файл в заданной директории, соответствующий маске. Что-то типа 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. но ведь при поиске по вложенным папкам требуется одновременно открывать несколько хендлов (по одному для каждой вложенной папки), а это (как я понимаю) возможно только с нескольких соединений. если есть ссылки на проги, организующие такой поиск или исходники - буду оч благодарен.
Я понял что требуется.... Вот только рекурсию, подобную той, которая используется при поиске на жестком диске, - на тцп не прикрутить.. Сам принцип тцп не позволит в одно соединение организовать рекурсивный поиск... Как вариант - это работа со списками (именно этот принцип заюзан в тотале), но ресурсы жрать будет прилично...
выкладываю сорцы и екзешник для поиска файлов на ФТП. создаёт кучу коннектов. мне это очень не нравится. хочу услышать выше мнение. ищет файлы на far сервере. об оптимизации не заботился. тестовый вариант.
попробуй слать ascii команды через сокеты поищи тут http://www.codeproject.com/internet/ftpclientclass.asp