user-0 提问: c语言获取FTP文件夹中的文件信息

回复:
user: user-1
content: Everything  ,web ftp 局域网架设很简单

user: user-2
content: 速度慢的话，可以自己起一个ftp服务器

user: user-2
content: 还可以，值得看看

user: user-3
content: 需要FTP服务端设置相应权限。

user: user-0
content: 这个问题楼主也是刚开始摸索，wininet还不太清楚，我在连接上自己搭载的本地服务器后，用了一个socket的send函数将一个list命令传给服务器，然后将服务器返回的文件列表输出来，但是服务器根目录下文件夹的文件是无法输出，请问一下 这种问题需要怎么解决呢，想输出目录下所有的文件包括文件夹内的文件，以及文件夹包含的文件的数量。

user: user-4
content: 如果你还要对子文件夹也要处理，这就麻烦了，需要把查找文件部分函数写成递归函数，并独立出来，以及要递归多少层，这些你自己去完成吧。

user: user-4
content: 这里是一个用 Windows wininet API 写的例子：#include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <windows.h> #include <wininet.h> #pragma comment(lib, "wininet.lib")  TCHAR szFtpUrl[] = _T("ftp://ftp.info-zip.org/pub/infozip"); TCHAR szUserAgent[] = _T("Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko");  int main(int argc, char *argv[]) {     TCHAR szHostName[INTERNET_MAX_HOST_NAME_LENGTH] = { 0 };     TCHAR szPathPart[INTERNET_MAX_PATH_LENGTH] = { 0 };     TCHAR szUserName[INTERNET_MAX_USER_NAME_LENGTH] = { 0 };     TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH] = { 0 };     URL_COMPONENTS uc   = { 0 };     uc.dwStructSize     = sizeof(URL_COMPONENTS);     uc.lpszScheme       = NULL;     uc.dwSchemeLength   = 0;     uc.nScheme          = INTERNET_SCHEME_DEFAULT;     uc.lpszHostName     = szHostName;     uc.dwHostNameLength = ARRAYSIZE(szHostName);     uc.nPort            = 0;     uc.lpszUserName     = szUserName;     uc.dwUserNameLength = ARRAYSIZE(szUserName);     uc.lpszPassword     = szPassword;     uc.dwPasswordLength = ARRAYSIZE(szPassword);     uc.lpszUrlPath      = szPathPart;     uc.dwUrlPathLength  = ARRAYSIZE(szPathPart);     uc.lpszExtraInfo    = NULL;     uc.dwExtraInfoLength= 0;     if (InternetCrackUrl(szFtpUrl, 0, 0, &uc) && (uc.nScheme == INTERNET_SCHEME_FTP))     {         HINTERNET hSession = InternetOpen(szUserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);         if (hSession != NULL)         {             HINTERNET hConnect = InternetConnect(hSession, szHostName, uc.nPort, szUserName, szPassword, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);             if (hConnect == NULL)             {                 hConnect = InternetConnect(hSession, szHostName, uc.nPort, szUserName, szPassword, INTERNET_SERVICE_FTP, 0, 0);             }             if (hConnect != NULL)             {                 if (FtpSetCurrentDirectory(hConnect, szPathPart))                 {                     WIN32_FIND_DATA wfd = { 0 };                     HINTERNET hFindFile = FtpFindFirstFile(hConnect, NULL, &wfd, INTERNET_FLAG_RELOAD, 0);                     if (hFindFile != NULL)                     {                         do {                             if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)                             {                                 _tprintf(_T("%s/\n"), wfd.cFileName);                             }                             else                             {                                 _tprintf(_T("%s\n"), wfd.cFileName);                             }                         } while (InternetFindNextFile(hFindFile, (LPVOID)&wfd));                         InternetCloseHandle(hFindFile);                     }                 }                 InternetCloseHandle(hConnect);             }             InternetCloseHandle(hSession);         }     }     return 0; }由于这个 FTP 网站速度慢，所以可能要等几秒钟。 因为我暂时找不到快速的 FTP 来的测试，现在 FTP 服务器太少了。