0

我在 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");
4

1 回答 1

0

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

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

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

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

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

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

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

于 2013-06-06T19:09:11.710 回答