Я пишу этот код в 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");
'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
u r god .. thank u !!!! – apo