Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;wininet ftp列出了许多文件错误_C++_Ftp_Wininet - Fatal编程技术网

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

C++ c++;wininet ftp列出了许多文件错误,c++,ftp,wininet,C++,Ftp,Wininet,我正在使用wininet连接到服务器。 所有作品都很好,上传,下载,列出命令等。。。。 因此我有一只小虫子,我不知道它是从哪里来的。 问题是,有些服务器文件夹包含超过100个文件(e.x的图像),但没有列出所有这些文件,就我所测试的列表而言,只有在任何文件夹中有91个文件时才会响应,超过这个数字,就无法显示或看到 下面是我的代码部分,我使用list-la选项列出文件夹以查看服务器上的所有文件 // Get Current Directory DWORD FTPdirsize = MAX_PATH

我正在使用wininet连接到服务器。 所有作品都很好,上传,下载,列出命令等。。。。 因此我有一只小虫子,我不知道它是从哪里来的。 问题是,有些服务器文件夹包含超过100个文件(e.x的图像),但没有列出所有这些文件,就我所测试的列表而言,只有在任何文件夹中有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
}
//获取当前目录
DWORD FTPdirsize=最大路径+8;
TCHAR FTPcurDir[MAX_PATH+8];
if(FtpGetCurrentDirectory(FTPsession、FTPcurDir和FTPdirsize)==TRUE){
腹地FTPcommandRecVal;
BOOL FTPres=FtpCommand(FTPsession、TRUE、FTP_TRANSFER_TYPE_BINARY、FTPsearchParam、NULL和ftpcommandeval);
if(FTPres和FTPcommandRecVal){
德沃德·德雷德;
char-szBuf[8192];
字符串FullStrBuf;
while(InternetReadFile(ftpcommandeval、szBuf、8192和dwRead)&&dwRead!=0){
FullStrBuf=szBuf;
FullStrBuf=FullStrBuf.substr(0,dwRead);
}
InternetCloseHandle(FTPcommandRecVal);
int-nIdx=0;
char szLine[8192]={0};
字符c;
int TheEndLenght=FullStrBuf.length();
对于(int i=0;i
请注意,我使用的是4096缓冲区,而不是8192缓冲区,它只列出文件夹中所有文件中的37个文件。 我把它改为8192,它会列出91个文件,8192以上的任何其他值对我的测试都是一样的,所以我猜肯定还有其他东西不允许正确列出所有文件,并且有一个限制。 服务器也没有通过ftp客户端列出文件的限制

我也从这个链接使用这个ftpparse


非常感谢您提供任何帮助以解决此错误。

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

while (InternetReadFile(FTPcommandRecVal, szBuf, 8192, &dwRead) && dwRead != 0)
{
    FullStrBuf.append(szBuf, dwRead);
}
建议:

如果<>代码> FultStrubf 在中间不包含<代码> '0’,可以使用<代码> STD::查找< /COD>或<代码> STD::FungFixStI/<代码>断开字符串。例如,假设

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;
}
for(size\u t start=0,pos=0;pos!=string::npos;)
{
pos=FullStrBuf.find_first_of(“\r\n”,start));
字符串s=FullStrBuf.substr(开始,位置-开始);
如果(s.size())
{

如果
FullStrBuf
不包含零,您是否也可以改进该函数。