在 2013年11月2日下午5:12,Jactry Zeng <jactry92@xxxxxxxxx>写道 > > > 很高兴你已经开始 hack 了~ > 我昨天做过一些测试,在 windows7 下,但是情况和你的看起来不太一样,我也还没彻底弄明白。 > MSDN 提到 This function has been replaced in Windows Vista by *IFileOperation*<http://msdn.microsoft.com/en-us/library/windows/desktop/bb775771%28v=vs.85%29.aspx>. 你在 win 7 下也可以正常使用 SHFileOperation 吗? > 而且情况也比较复杂,从 MSDN 可以看出 SHFileOperation 支持一次传入多个 路径/文件 进行处理,以 “\0” > 分割、”\0\0”结尾,所以就存在其中一些/个 路径/文件 不存在,另外一些/个存在的的情况。 > 你说的对,这种情况比较常见,我没有考虑过 > 以下是我的测试代码: > <code> > #include <stdio.h> > #include <windows.h> > > int main() > { > SHFILEOPSTRUCT FileOp; > ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT)); > FileOp.fFlags = FOF_NOCONFIRMATION; > FileOp.hNameMappings = NULL; > FileOp.hwnd = NULL; > FileOp.lpszProgressTitle = NULL; > FileOp.pTo = NULL; > FileOp.wFunc = FO_DELETE; > FileOp.pFrom = “1.txt\0t/\0\0"; > printf("%d\n", SHFileOperation(&FileOp)); > return 0; > } > </code> > 这是在 win7 的一些结果: > 1. touch 1.txt && mkdir t => 0 > 2. touch 1.txt => 124 and didn't remove 1.txt > 3. mkdir t => 2 and didn't remove t > > 从这里还可以看出,ERROR_FILE_EXISTS 和 ERROR_PATH_NOT_FOUND 两种情况可能是 > 需要区别对待的。 > 我不知道是否是因为不同 windows 版本所以导致了结果不一样? > 我认为是的。 > 所以还需要更多测试。 > > 我建议 Zhenbo 可以不急着想怎么修这个 bug,而可以从给 shell32 添加 testcase 开始, > 现在你已经能写出程序程序了,只要把这部分代码整理下,放进现有的 tests 中就 ok 了。 > 当然你需要把你能想到的情况都写成 testcase,尽可能覆盖。 > 然后 Wine 的 testbot 提供了多个 windows 版本,你也可以先把自己写的测试程序放到 > testbot 上跑下,看看不同 windows 版本处理的方式是不是一样。 > > 恩,我正在看 testcase 的写法 但我有一个问题:在 testcase 里,应该怎么写,来保证去删除一个不存在的文件呢? > -- > Regards, > Jactry Zeng > -- Have a nice day! Zhenbo Li