c ++ wininet ftp列出许多文件错误

Posted

技术标签:

【中文标题】c ++ wininet ftp列出许多文件错误【英文标题】:c++ wininet ftp listing many files bug 【发布时间】:2018-02-15 16:09:01 【问题描述】:

我正在使用 wininet 连接到服务器。 一切正常,上传,下载,列出命令等...... 因此,我有一个小错误,我不知道它来自哪里。 错误是某些包含超过 100 个文件(例如图像)的服务器文件夹未全部列出,据我测试,列表仅响应任何文件夹中的 91 个文件,超过该数量时无法显示或查看.

这是我的代码的一部分,我使用 list -la 选项列出文件夹以查看服务器上的所有文件

// Get Current Directory
DWORD FTPdirsize = MAX_PATH + 8;
TCHAR FTPcurDir[MAX_PATH + 8];
if (FtpGetCurrentDirectory(FTPsession, FTPcurDir, &FTPdirsize) == TRUE)
    HINTERNET FTPcommandRecVal;
    BOOL FTPres = FtpCommand(FTPsession, TRUE, FTP_TRANSFER_TYPE_BINARY, FTPsearchParam, NULL, &FTPcommandRecVal);
    if (FTPres && FTPcommandRecVal)
        DWORD dwRead;
        char szBuf[8192];
        string FullStrBuf;
        while (InternetReadFile(FTPcommandRecVal, szBuf, 8192, &dwRead) && dwRead != 0)
            FullStrBuf = szBuf;
            FullStrBuf = FullStrBuf.substr(0, dwRead);
        
        InternetCloseHandle(FTPcommandRecVal);
        int nIdx = 0;
        char szLine[8192] =  0 ;
        char c;
        int TheEndLenght = FullStrBuf.length();
        for (int i = 0; i < TheEndLenght - 1; i++)
            c = FullStrBuf[i];
            if (c == '\r' || c == '\n' || c == '\0')
                if (nIdx)
                    struct ftpparse fp;
                    int nRes = ftpparse(&fp, szLine, nIdx);
                    if (nRes)
                        // Name
                        wstring FTPsrvFFnameW = fp.strName;
                        FTPList.push_back(FTPsrvFFnameW);
                    
                
                for (int j = 0; j < sizeof(szLine); j++)
                    szLine[j] = 0;
                
                nIdx = 0;
            
            else
                szLine[nIdx++] = c;
            
        

        ////... print function for FTPList
    
    else
        InternetCloseHandle(FTPcommandRecVal);
        /////... ERROR HANDLING
    

else
    /////... ERROR HANDLING

请注意,我使用的是 4096 缓冲区而不是 8192,并且它仅列出文件夹中所有文件中的 37 个文件。 我将其更改为 8192 并列出直到 91 个文件,高于 8192 的任何其他值都与我的测试相同,所以我想肯定还有其他东西不允许正确列出所有文件并且有限制。 服务器也没有限制通过 ftp 客户端列出文件。

我也使用这个链接中的这个 ftpparse https://cr.yp.to/ftpparse.html

非常感谢任何帮助解决此错误。

【问题讨论】:

【参考方案1】:

FullStrBuf中的旧信息在调用FullStrBuf = szBuf;后丢失,改用:

while (InternetReadFile(FTPcommandRecVal, szBuf, 8192, &dwRead) && dwRead != 0)

    FullStrBuf.append(szBuf, dwRead);

建议:

如果FullStrBuf中间不包含'\0',则可以使用std::findstd::find_first_of断字符串。例如,假设 FullStrBuf 包含 "\n""\r\n" 换行:

for(size_t start = 0, pos = 0; pos != string::npos;)

    pos = FullStrBuf.find_first_of("\r\n", start);
    string s = FullStrBuf.substr(start, pos - start);
    if(s.size())
    
        cout << s << endl;
        //ftpparse ...
    
    start = pos + 1;

【讨论】:

如果FullStrBuf 不包含零,您也可以改进功能。

以上是关于c ++ wininet ftp列出许多文件错误的主要内容,如果未能解决你的问题,请参考以下文章

WinInet ftp 连接错误 123

C ++ FTP WinINet,无法从FTP服务器下载文件夹

Wininet & C++:使用 FTP 写入和附加,而不是覆盖,文件

wininet ftp程序遇到seg错误

C++ 使用 WinINet 上传到 FTP 服务器

C++ WinInet InternetCloseHandle 崩溃