【问题标题】:SHFILEOPERATION with ShowMessage - C++ BuilderSHFILEOPERATION 与 ShowMessage - C++ Builder
【发布时间】:2013-06-02 08:38:20
【问题描述】:

我在 C++ Builder 中编写此代码以将一些文件夹从安装在 x: 上的网络文件夹(例如 x:\games\foldername)复制到本地路径:d:\program files。我使用 shfileopstruct 如下。

源路径(s 变量)是使用 FieldByName("path") 从数据库中获取的,然后给它一个前缀(“x:\games\”和 MSDN 建议的“\0”。 SHFILEOPERATION 工作正常.. 但不同寻常的是,当我删除有关 ShowMessage(path) 的代码(我有用于验证)时,SHFILEOPERATION 确实失败了。

对此有什么建议吗?我错过了什么吗? 我很感激你的帮助,因为我没有经验。 提前致谢。

UnicodeString s="";   //source path   
UnicodeString d="";  //destination        
UnicodeString path="";   //path from database field

if(ClientDataSet1->Active==false)
    ClientDataSet1->Open();

path=ClientDataSet1->FieldByName("path")->Text;   //get [path] value from db
ShowMessage(path);            /// !!!! <<<-------- ???  SHOWMESSAGE ???

s="x:\\games\\" + path + "\0" ;
d="d:\\program files\0"  ;

// Create the SHFILEOPSTRUCT and zero it.
SHFILEOPSTRUCT fos;

memset(&fos, 0, sizeof(fos));
fos.hwnd = Handle;
fos.wFunc = FO_COPY;
fos.pFrom = s.c_str();
fos.pTo = d.c_str();
fos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR;

int n=SHFileOperation(&fos);
    if(n)
        ShowMessage(n);
    else
        ShowMessage("OK");

【问题讨论】:

    标签: copy c++builder shfileoperation


    【解决方案1】:

    在构建 s 变量时,您将附加 "\0"(双引号),它被解释为 0 长度的字符串连接,因此是无操作的,因此 s 实际上不是双空终止正确。换句话说,这段代码:

    s="x:\\games\\" + path + "\0" ; 
    

    + 操作员的角度来看,实际上与此代码相同:

    s="x:\\games\\" + path + "" ; 
    

    为了实际附加一个空字符,请改用'\0'(单引号)(是的,单个字符可以附加到字符串):

    s="x:\\games\\" + path + '\0' ; 
    

    您的 d 变量正确地以双空终止,因为 \0 包含在较大的字符串文字中,因此不会丢失。

    【讨论】:

    • UnicodeString::operator+ 将 UnicodeString 作为参数,因此字符串 "\0" 首先由构造函数 UnicodeString(const wchar_t* src, int len = -1) 转换。这个构造函数复制字符串直到找到\0,所以结果是空字符串。您可以使用此构造函数并指定长度:s="x:\\games\\" + path + UnicodeString("\0", 1);。正如 Remy Lebeau 所写,您还可以使用 '\0',它等同于 s="x:\\games\\" + path + UnicodeString('\0');。我建议如果您要使用'\0',请在此行添加评论:)
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2013-09-25
    • 2017-07-22
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多