SHFileOperation使用字符串复制文件夹



我试图通过SHFileOperationA函数复制文件夹。这是我的代码。

int main()  {
    SHFILEOPSTRUCTA sf;
    int result;
    string source = "D:\check\folder4";
    string dest = "D:\Documents\test\folder4";
    sf.pFrom = source.c_str( );
    sf.pTo = dest.c_str( );
    sf.wFunc = FO_COPY;
    sf.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_SILENT;
    result = SHFileOperationA(&sf);
    return 0;
}

我不能够理解,如何使字符串由追加两次。我试过这样做。

    string source = "D:\check\folder4\0\0";
    string dest = "D:\Documents\test\folder4\0\0";

但是,它不工作。我也尝试了更多的组合,但没有一个是工作。请问谁能建议我如何解决这个问题?

我可以通过像这样直接分配路径来解决这个问题:-
    sf.pFrom = "D:\check\folder4";
    sf.pTo = "D:\Documents\test\folder4";

,问题得到解决,但我的意图是利用字符串。有谁能帮我一下吗?

另外,如果可能的话,谁能告诉我为什么直接分配字符串常数,即sf.pFrom = "D:\check\folder4";是工作的,使用sf.pFrom = source.c_str( );这样的字符串分配是不工作的?

std::string执行strlen(或类似操作)来查找常量字符数组的末尾,并只分配所需的字符数。所以它停在第一个空上,不复制另一个。如果你想要重写这个,你需要使用带size参数的构造函数,比如:

string source("D:\check\folder4\0", 18);

请注意,第二个空字符是自动添加的,就像其他字符串一样。

或者显式地添加空字符,如(更好的解决方案):

std::string source = std::string("D:\check\folder4") + std::string(1, '');

std::string source = "D:\check\folder4";
source.append(1, '');

至于另一个问题,为什么使用常量字符数组工作:

我相信,如果它工作,它只是一个纯粹的运气,字节/字符在内存中的常量字符数组后为空。

您可以自己测试(在调试器中或通过打印值):

// this is the compiler generated null
(*(sf.pFrom + strlen(sf.pFrom))) == ''
// this is the following byte/character that should be luckily null
(*(sf.pFrom + strlen(sf.pFrom) + 1)) == '' 

如果您发现以下字符在调试器中不为空,请确保您完成调试直到SHFileOperationA。在这种特殊情况下,它可能会失败/崩溃/其他(而通常不会),因为您单独调试可能会使内存映像不同。

你也没有说明你所说的"它有效"到底是什么意思。你的意思是SHFileOperationA的结果(它是什么)。或者当应用程序不工作时,它会崩溃/抛出。或者文件是否被复制了。

相关内容

  • 没有找到相关文章

最新更新