SHFileOperation 这个API函数怎么用起来结果飘忽不定?

starytx 2014-01-10 06:13:08
环境:vs2005.我的一个复制文件夹的函数如下:
// 将原路径srcDir中的文件/文件夹(不包括srcDir本身),拷贝到目标路径desDir下,存在的话覆盖
bool copyForder(const char * srcDir,const char *desDir)
{
SHFILEOPSTRUCT fop;
ZeroMemory(&fop, sizeof(fop));
fop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR |FOF_MULTIDESTFILES;
fop.wFunc = FO_COPY;
fop.pFrom = _T(srcDir);
fop.pTo = _T(desDir);

int nResult = SHFileOperation(&fop);
if(0 == nResult)
{
return true;
}

return false;
}

测试代码如下:
	string src="D:\\source\\";
string des = "D:\\dest\\aaa\\";
if(!copyForder(src.c_str() ,des.c_str()))
printf("文件夹拷贝失败!\n");
else
printf("文件夹拷贝成功!\n");
好像文件夹路径最后加不加那个斜杠会影响结果?之前试的时候从source往dest中复制的话怎么折腾都成功,现在往dest下的aaa文件夹里放感觉有时候就会失败,nResult返回值有时候是123,有时候是87,有墙,还查不到更多的信息,有时候复制成功但是又吧source本身都复制过去了,好混乱啊,到底怎么正确使用呢?
...全文
698 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2014-01-11
  • 打赏
  • 举报
回复
这函数真不好用,运行的时候一会儿失败一会儿成功的,哎,还是递归复制算了。
vipcxj 2014-01-10
  • 打赏
  • 举报
回复
引用 5 楼 starytx 的回复:
[quote=引用 2 楼 vipcxj 的回复:] Important You must ensure that the source and destination paths are double-null terminated. A normal string ends in just a single null character. If you pass that value in either the source or destination members, the function will not realize when it has reached the end of the string and will continue to read on in memory until it comes to a random double null value. This can at least lead to a buffer overrun, and possibly the unintended deletion of unrelated data. 如果非要说LZ有啥问题,你的源路径和目标路径都必须是双null结尾,因为这个API支持多个路径放一起,用null隔开,所以双null才是标志路径结束。 example

// WRONG
LPTSTR pszSource = L"C:\\Windows\\*";

// RIGHT
LPTSTR pszSource = L"C:\\Windows\\*\0";
我看过网上说的,末尾也加上"\0\0"了,还是不稳定[/quote] 应该是多一个"\0",因为字符串本身就有一个"\0",不过感觉这貌似不是问题,LZ可以试试把FOF_NOERRORUI这个flag去掉,看看错误到底是啥~ 还有我上面给的示例代码就是msdn提供的,或许它就是不支持末尾是"\\"的,你干脆再弄个函数,一旦末尾源路径末尾是"\\",你就改成"\\*\0",这应该不难吧~
starytx 2014-01-10
  • 打赏
  • 举报
回复
引用 2 楼 vipcxj 的回复:
Important You must ensure that the source and destination paths are double-null terminated. A normal string ends in just a single null character. If you pass that value in either the source or destination members, the function will not realize when it has reached the end of the string and will continue to read on in memory until it comes to a random double null value. This can at least lead to a buffer overrun, and possibly the unintended deletion of unrelated data. 如果非要说LZ有啥问题,你的源路径和目标路径都必须是双null结尾,因为这个API支持多个路径放一起,用null隔开,所以双null才是标志路径结束。 example

// WRONG
LPTSTR pszSource = L"C:\\Windows\\*";

// RIGHT
LPTSTR pszSource = L"C:\\Windows\\*\0";
我看过网上说的,末尾也加上"\0\0"了,还是不稳定
vipcxj 2014-01-10
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
[quote=引用 1 楼 vipcxj 的回复:] http://msdn.microsoft.com/en-us/library/windows/desktop/bb775771(v=vs.85).aspx 微软更推荐用IFileOperation
怎么用啊?比较紧急啊,没有多少时间来自己研究了,或者有其他好用的赋值文件夹的代码也可以。xcopy命令行的就算了,现有的就是这个,用其他的来替换的。[/quote] 我刚刚又看了下IFileOperation要求windows最低版本wista,实在有点坑,LZ,你试试我说的在字符串结尾在加个"\0"吧,这是msdn说滴 其实copy文件,boost提供了一个跨平台的支持,就是FileSystem库,不过这个库是需要编译的。用法和Java里的File类很像,并且提供文件拷贝,复制,删除等等操作~
starytx 2014-01-10
  • 打赏
  • 举报
回复
引用 1 楼 vipcxj 的回复:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775771(v=vs.85).aspx 微软更推荐用IFileOperation
怎么用啊?比较紧急啊,没有多少时间来自己研究了,或者有其他好用的赋值文件夹的代码也可以。xcopy命令行的就算了,现有的就是这个,用其他的来替换的。
vipcxj 2014-01-10
  • 打赏
  • 举报
回复
Important You must ensure that the source and destination paths are double-null terminated. A normal string ends in just a single null character. If you pass that value in either the source or destination members, the function will not realize when it has reached the end of the string and will continue to read on in memory until it comes to a random double null value. This can at least lead to a buffer overrun, and possibly the unintended deletion of unrelated data. 如果非要说LZ有啥问题,你的源路径和目标路径都必须是双null结尾,因为这个API支持多个路径放一起,用null隔开,所以双null才是标志路径结束。 example

// WRONG
LPTSTR pszSource = L"C:\\Windows\\*";

// RIGHT
LPTSTR pszSource = L"C:\\Windows\\*\0";
vipcxj 2014-01-10
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775771(v=vs.85).aspx 微软更推荐用IFileOperation
内容概要:本文系统阐述了基于格子Boltzmann方法(LBM)对二维通道内多孔介质流动进行数值模拟的完整理论体系与实现流程,配套提供了详尽的Matlab代码实现方案。研究深入剖析了LBM在复杂流体系统建模中的独特优势,尤其适用于处理多孔介质等具有不规则微观结构的流动问题。内容涵盖LBM的基本离散化模型、演化方程推导、边界条件(如反弹边界、速度边界)的精确处理、多孔介质结构的数字化建模、关键物理参数(雷诺数、孔隙率、渗透率)的设定与调控,以及流场结果的后处理与可视化技术。通过典型算例的仿真与结果分析,验证了该数值方法在捕捉多孔介质内部流速分布、压力梯度及渗透特性方面的有效性与高精度,为相关领域的科学研究与工程应用提供了可靠的数值实验平台。; 适合人群:具备流体力学、计算物理学或相关学科的基础理论知识,熟练掌握Matlab编程语言,正在从事计算流体力学(CFD)、多孔介质渗流、地下水文学、石油工程、生物流体力学或材料科学等领域研究的硕士/博士研究生、青年科研人员及工程技术专家。; 使用场景及目标:①深入学习和掌握格子Boltzmann方法的核心原理、算法流程及其相较于传统CFD方法的独特优势;②复现学术文献中关于多孔介质流动的经典仿真案例,验证自身研究模型的正确性;③为自身的科研课题开发定制化的数值模拟工具,用于探究多孔结构参数对流体输运性能的影响规律; 阅读建议:建议读者结合提供的Matlab代码逐行研读,重点关注LBM算法中“碰撞”与“迁移”两大核心步骤的编程实现逻辑,动手调试代码以观察不同参数(如松弛时间、网格分辨率)对模拟结果的影响,从而加深对介观尺度流体动力学行为的理解,并为进一步的模型拓展和算法优化奠定坚实基础。
【期刊论文复现】基于飞轮锂电池混合储能平抑风电功率策略(Simulink仿真实现)内容概要:本文围绕“基于飞轮锂电池混合储能平抑风电功率波动策略”展开研究,通过Simulink搭建仿真模型,复现并验证了相关期刊论文中的技术方案。文中详细介绍了混合储能系统的工作原理,重点分析了飞轮储能与锂电池在响应速度、能量密度等方面的互补特性,提出一种合理的功率分配策略(如低通滤波或小波变换)将风电波动信号分解为高低频分量,分别由锂电池和飞轮承担,从而有效平抑风电功率波动、延长储能设备寿命。研究涵盖了系统建模、控制策略设计、仿真参数设置及结果分析全过程,并提供了完整的Simulink模型与代码资源。; 适合人群:具备一定电力系统、新能源或自动控制基础知识,从事相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习和复现高水平期刊论文中的混合储能控制策略;② 掌握利用Simulink进行风电-储能系统建模与仿真的方法;③ 深入理解飞轮与锂电池混合储能系统的协同控制机制与优势。; 阅读建议:建议读者结合提供的完整资源(模型、代码、文档)按目录顺序学习,重点关注控制策略的设计逻辑与仿真结果的分析,动手实践以加深理解,并可在此基础上进行参数优化或策略改进。
内容概要:本文系统阐述了基于格子Boltzmann方法(LBM)对二维通道内多孔介质流动进行数值模拟的完整理论体系与实现流程,重点介绍LBM的基本原理、多孔介质的建模策略、边界条件的设置方法,以及碰撞与传播过程的算法设计。通过Matlab编程实现了流场的时间演化过程,对速度分布、压力场等关键物理量进行了可视化分析与定量验证,充分展示了LBM在处理复杂几何结构流动问题中的优势与精度。该研究不仅提供了清晰的算法实现路径,还构建了一套可复现、可拓展的仿真框架,有助于深入理解多孔介质内的渗流机理与宏观流动行为之间的关联。; 适合人群:具备一定流体力学基础知识和Matlab编程能力的研究生或科研人员,尤其适用于从事多孔介质流动、计算流体力学(CFD)或LBM方法研究的相关领域学者。; 使用场景及目标:①掌握格子Boltzmann方法在复杂介质流动模拟中的应用流程;②学习如何利用Matlab实现LBM算法并进行流场仿真;③为相关科研项目或学术论文提供可复现的代码参考和技术支撑;④深化对多孔介质中渗流机理的理解。; 阅读建议:建议读者结合文中理论推导与代码逐行对照学习,动手运行并调试程序以加深理解,同时可尝试修改参数或模型结构以拓展应用场景,提升科研实践能力。

65,214

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧