相信对文件夹操作是大家都会经常碰到的问题。而在文件夹操作中,利用 SHFILEOPSTRUCT 进行操作是最快最方便的,而Windows本身自己也用这个进行文件夹的操作,如移动,复制,粘帖等操作。 而最近我在用SHFILEOPSTRUCT进行文件夹移动的时候,却发现它有好几个需要注意的问题。 首先,给出MSDN以及大部分网上会给出的示例代码: SHFILEOPSTRUCT sfo; sfo.hwnd = NULL; sfo.wFunc = FO_MOVE; sfo.pFrom = "D:\\1"; sfo.pTo = "D:\\2"; sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; hr = SHFileOperation(&sfo); 以上便是网上出现最多的代码。 这里有两个问题,这两个问题主要都是集中在sfo.pFrom和sfo.pTo中。 假如代码如下: SHFILEOPSTRUCT sfo; char sfrom[256], sto[256]; strcpy(sfrom, "D:\\1"); strcpy(sto, "D:\\2"); sfo.hwnd = NULL; sfo.wFunc = FO_MOVE; sfo.pFrom = sfrom; sfo.pTo = sto; sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; hr = SHFileOperation(&sfo); 在这种情况下,上述操作无效。 第二种错误代码如下: SHFILEOPSTRUCT sfo; char sfrom[256], sto[256]; strcpy(sfrom, ".\\data\\1"); strcpy(sto, ".\\data\\2"); sfo.hwnd = NULL; sfo.wFunc = FO_MOVE; sfo.pFrom = sfrom; sfo.pTo = sto; sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; hr = SHFileOperation(&sfo); 在这种情况下,上述操作也无效。 第一种代码无效的修改方法是: SHFILEOPSTRUCT sfo; char sfrom[256], sto[256]; memset(sfrom,0,256); memset(sto,0,256); strcpy(sfrom, "D:\\1"); strcpy(sto, "D:\\2"); sfo.hwnd = NULL; sfo.wFunc = FO_MOVE; sfo.pFrom = sfrom; sfo.pTo = sto; sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; hr = SHFileOperation(&sfo); 第二种错误的修改方法是将相对路径改为绝对路径。 我猜想这可能和windows的内部处理有关。但是不确定,谁让人家不开源呢。

评论