JHo*_*zer 0 c++ windows winapi file-management path-combine
我在使用PathCombine函数时遇到了一些困难.它似乎与SHFileOperation()无法正常工作.我的代码如下:
//beginning of method
TCHAR* root = new TCHAR[MAX_PATH];
root = L"C:\\Users\\jhow\\Desktop\\\0";
//later on in the method
TCHAR* t1Dir = new TCHAR[MAX_PATH]; //root
TCHAR* t2Dir = new TCHAR[MAX_PATH]; //temp
PathCombine(t1Dir,root,L"Folder1\\%REPLACE_THIS%\\\0");
PathCombine(t2Dir,root,L"Folder1\\temp\0");
sf.pFrom = t1Dir;
//sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";
sf.pTo = temporaryDir;
//Copy files
int n = SHFileOperation(&sf);
Run Code Online (Sandbox Code Playgroud)
当我拥有它就像上面一样,该方法看到sf.pTo,但由于某种原因它没有看到sf.pFrom(即使在路径名末尾使用\和\ 0的不同组合).n变为2,我认为意味着文件未找到...但是例如,当我评论出来时.
sf.pFrom = t1Dir;
Run Code Online (Sandbox Code Playgroud)
并替换为:
sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";
Run Code Online (Sandbox Code Playgroud)
SHFileOperation()有效...它返回零,我可以看到所有文件都被复制到目录中.我发现这看起来很奇怪,因为它们似乎是完全相同的字符串(即使我调试并将鼠标悬停在变量上)......任何人都知道为什么会发生这种情况?我的语法或逻辑有问题吗?因为我没有看到它.我正在使用Visual Studio 2008.非常感谢您的时间.
您正在为您的root变量在堆上分配缓冲区,但随后立即将该变量指向只读字符串文字,从而泄漏分配的缓冲区.
更重要的是,您没有考虑SHFileOperation()对双空终止字符串进行操作,而是PathCombine()返回单个以null结尾的字符串.您正尝试在输入中包含一个额外的null PathCombine(),但由于PathCombine()将单个以null结尾的字符串作为输入,因此它将无法工作,因此它永远不会看到您的额外空值.您需要在输出缓冲区中分配足够的空间来保存额外的空终止符,然后确保在将这些缓冲区传递给之前将它们设置为零SHFileOperation().
试试这个:
LPTSTR root = TEXT("C:\\Users\\jhow\\Desktop\\");
TCHAR t1Dir[MAX_PATH+2] = {0};
TCHAR t2Dir[MAX_PATH+2] = {0};
PathCombine(t1Dir, root, TEXT("Folder1\\%REPLACE_THIS%\\"));
PathCombine(t2Dir, root, TEXT("Folder1\\temp"));
sf.pFrom = t1Dir;
sf.pTo = t2Dir;
int n = SHFileOperation(&sf);
Run Code Online (Sandbox Code Playgroud)