使用ShowMessage进行SHFILEOPERATION - C ++ Builder

时间:2013-06-06 10:58:10

标签: copy c++builder shfileoperation

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

使用FieldByName(“path”)从数据库中获取源路径(s变量),然后为MSDN建议给它一个前缀(“x:\ games \”和“\ 0”)。 SHFILEOPERATION工作得很好..但不寻常的是当我删除关于ShowMessage(路径)的代码(我有验证)时,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");

1 个答案:

答案 0 :(得分:0)

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

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

+运营商的角度来看,实际上与此代码相同:

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

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

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

您的d变量正确地被双重终止,因为\0包含在更大的字符串文字中,所以它不会丢失。