CFtpFileFind类遍历FTP目录文件数限制的问题,十万级以上,FindFile延迟怎么解决

C++语言 码拜 6年前 (2015-05-11) 603次浏览 0个评论

最近做的一个接口,需要从一个FTP目录下载大量图片数据,某某原因就不说了,反正就是根目录下直接来106万张图片,大概每张250k左右,windows资源管理器访问FTP时都打不开。
实现方式如下:

m_ftp_connect->GetCurrentDirectory(cur_path);
m_log->WriteLog(kLogInfo,"开始遍历源FTP目录:%s", cur_path.GetBuffer());

DWORD beginTm  = ::GetTickCount();
CFtpFileFind finder(m_ftp_connect);
BOOL bWorking=finder.FindFile("*.*");

while (bWorking)
{
	bWorking = finder.FindNextFile();
	DWORD endTm = ::GetTickCount() - beginTm;
	if (finder.IsDots() ) 
		continue;
         //........
}

 定位后发现卡在FindFile()这个位置不动。

自己在本地模拟环境时尝试了在根目录下放了约12W图片,27G,得到的endTm值大概在17000~24000之间。这意味着在现场环境下这种遍历方式会卡在这里更长时间。
大家有没有啥好的解决方案或者对这种状况的比较好的解释?

20分
system(“dir /b /a-d c:\*.* >d:\allfiles.txt”);
//读文件d:\allfiles.txt的内容即C:\下所有文件的名字
system(“dir /b /a-d /s c:\*.* >d:\allfilesinsub.txt”);
//读文件d:\allfilesinsub.txt的内容即C:\下所有文件的名字包含子目录
system(“dir /b /ad  c:\*.* >d:\alldirs.txt”);
//读文件d:\alldirs.txt的内容即C:\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
引用 1 楼 zhao4zhong1 的回复:

system(“dir /b /a-d c:\*.* >d:\allfiles.txt”);
//读文件d:\allfiles.txt的内容即C:\下所有文件的名字
system(“dir /b /a-d /s c:\*.* >d:\allfilesinsub.txt”);
//读文件d:\allfilesinsub.txt的内容即C:\下所有文件的名字包含子目录
system(“dir /b /ad  c:\*.* >d:\alldirs.txt”);
//读文件d:\alldirs.txt的内容即C:\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。

赵老师好~多谢指点。
shell指令我也用过~  可是这里遍历FTP目录下的文件,测试过在控制台访问FTP之后使用dir命令可以将列表定向到本地文件中,但是在控制台的FTP里面的dir命令貌似没有带参数的。ls命令可以把文件列表(不包含目录)定向到本地文件中。
如果这样的话解决方案就是
1、通过socket连接FTP
2、发送dir指令将远程目录文件写到本地文本
3、在里面找到目录之后再发送ls+刚获取的目录
4、找到文件列表

这样比较麻烦的是没办法直接去处理~   

处理十万级以上的任何对象,最好都借助本地临时文件;不然的话,光内存紧张、流程中断重启后继续、断点续传、……等问题就够你喝好几壶了!
如果你觉得用临时文件效率偏低,请参考:
无profiler不要谈效率!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
引用 4 楼 zhao4zhong1 的回复:

如果你觉得用临时文件效率偏低,请参考:
无profiler不要谈效率!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!

不好意思点错了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明CFtpFileFind类遍历FTP目录文件数限制的问题,十万级以上,FindFile延迟怎么解决
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!