相信对文件夹操作是大家都会经常碰到的问题。而在文件夹操作中,利用 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的内部处理有关。但是不确定,谁让人家不开源呢。
评论