PathCombine功能无法正常工作

时间:2012-05-15 00:15:55

标签: 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);

如果它像上面一样,该方法看到了sf.pTo,但由于某种原因它没有看到sf.pFrom(即使在路径末端使用\和\ 0的不同组合名称)。 n变为2,我认为这意味着没有找到文件...但是例如,当我注释掉时。

    sf.pFrom = t1Dir;

并将其替换为:

    sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";

SHFileOperation()有效...它返回零,我可以看到所有文件都被复制到目录中。我发现这看起来很奇怪,因为它们似乎是完全相同的字符串(即使我调试并将鼠标悬停在变量上)......任何人都知道为什么会发生这种情况?我的语法或逻辑有问题吗?因为我没有看到它。我正在使用Visual Studio 2008.非常感谢你的时间。

1 个答案:

答案 0 :(得分:5)

您正在堆上为root变量分配一个缓冲区,但是然后立即将该变量指向只读字符串文字,从而泄漏分配的缓冲区。

更重要的是,您没有考虑SHFileOperation()对双空终止字符串进行操作,但是PathCombine()会返回一个以空字符结尾的字符串。您正尝试在PathCombine()的输入中包含一个额外的null,但由于PathCombine()将以单个空终止的字符串作为输入,因此它将无效,因此它永远不会看到您的额外空值。您需要在输出缓冲区中分配足够的空间来容纳额外的空终止符,然后确保在将这些缓冲区传递给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);