2013-06-06 4 views
0

Я пишу этот код в C++ Builder для копирования некоторых папок из сетевой папки, установленной на x: (например, x: \ games \ имя_папки), на локальный путь: d: \ program files. Я использую shfileopstruct следующим образом.SHFILEOPERATION with ShowMessage - C++ Builder

Исходный путь (переменная) берется из базы данных с использованием FieldByName («путь»), а затем ему предоставляется префикс («x: \ games») и «\ 0», как предлагает MSDN. SHFILEOPERATION works отлично, но это необычно, чем когда я удаляю код 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"); 

ответ

0

При создании вашей переменной s вы добавляете "\0" (двойные кавычки), который интерпретируется как конкатенация длины 0-й строки и, следовательно, нет-op, поэтому s фактически НЕ имеет двойное нулевое завершение. Другими словами, этот код:

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

фактически то же самое, как этот код, с точки зрения + оператора:

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

Для того, чтобы на самом деле присоединять нулевой символ, используйте '\0' (одиночные кавычки) вместо этого (да, один Char может быть добавлен в строку):

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

Вашего d переменного двойной нуль кор прямо потому, что \0 включен в большой строковый литерал, чтобы он не потерялся.

+0

'UnicodeString :: operator +' принимает UnicodeString как параметр, поэтому строка '' \ 0 "' сначала преобразуется конструктором 'UnicodeString (const wchar_t * src, int len ​​= -1)'. Этот конструктор копирует строку до тех пор, пока не найдет '\ 0', поэтому результат будет пустой. Вы можете использовать этот конструктор и указать длину: 's =" x: \\ games \\ "+ path + UnicodeString (" \ 0 ", 1);'. Как писал Реми Лебо, вы также можете использовать '' \ 0'', что эквивалентно 's =" x: \\ games \\ "+ path + UnicodeString ('\ 0');'. Я предлагаю, если вы собираетесь использовать '' \ 0'', добавьте комментарий к этой строке :) – marbel82

+0

u r god .. thank u !!!! – apo