SHFileOperation使用字符串复制文件夹

时间:2013-04-12 10:57:07

标签: c++ string stdstring 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;
}

我无法理解如何将字符串\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( );之类的字符串分配不起作用?

提前致谢。

1 个答案:

答案 0 :(得分:2)

std::string执行strlen(或类似)以查找常量char数组的结尾,并仅分配所需的字符数。所以它在第一个null上停止而不复制另一个。如果要覆盖它,则需要使用带大小的构造函数,如:

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

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

或者明确地添加空字符(方式更好的解决方案):

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

或者

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

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

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

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

// this is the compiler generated null
(*(sf.pFrom + strlen(sf.pFrom))) == '\0'

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

如果在调试器中发现以下字符不为空,请确保在SHFileOperationA之前完成调试。在特定情况下,它可能会失败/崩溃/无论什么(虽然它通常不会),因为您单独调试的事实可能会使内存映像不同。

此外,您还没有通过“工作原理”指定您的确切含义。你的意思是SHFileOperationA的结果(它是什么)。或者当应用程序不起作用时应用程序崩溃/抛出。或者是否复制了文件。这可能有助于回答你。