bool __fastcall TODF_ThreadPro::CopyOneFile (String Src, String Dest, int Option_Copy){ try { if (Option_Copy == 1) Src += "_копия"; if (!CopyFileExW(Src.w_str(), Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy)) //COPY_FILE_FAIL_IF_EXISTS { //Преобразование длинных имен файлов в короткие String S_Src, S_Dest; GetShortPathNameW(Src.w_str(), S_Src.w_str(), 32767); GetShortPathNameW(Dest.w_str(), S_Dest.w_str(), 32767); if (!CopyFileExW(S_Src.w_str(), S_Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy)) //COPY_FILE_FAIL_IF_EXISTS { String Error_String = SysErrorMessage (GetLastError()); VOID SetLastError (IN DWORD dwErrCode); Application->NormalizeTopMosts(); #ifdef _DELPHI_STRING_UNICODE Application->MessageBox((Error_String + " + Src + ">").w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST); #else Application->MessageBox((Error_String + " + Src + ">").w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST); #endif Application->RestoreTopMosts(); return false; } } return true; } catch(...) { return false; }}
DWORD WINAPI GetShortPathName( __in LPCTSTR lpszLongPath, __out LPTSTR lpszShortPath, // __in DWORD cchBuffer);
try { if (Option_Copy == 1) Src += "_копия"; String S_Src, SS_Src, S_Dest, SS_Dest; SS_Src = "\\\\?\\"; SS_Src += Src; Src = SS_Src; SS_Dest = "\\\\?\\"; SS_Dest += Dest; Dest = SS_Dest; if (!CopyFileExW(Src.w_str(), Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy)) { int length = GetShortPathNameW(Src.w_str(), NULL, 0); if (length != 0) { wchar_t *buffer = new wchar_t[length]; length = GetShortPathNameW(Src.w_str(), (wchar_t *)buffer, length); if (length != 0) { S_Src = (String)buffer; if (!CopyFileExW(S_Src.w_str(), Dest.w_str(), CopyProgressRoutine, NULL, NULL, Option_Copy)) //COPY_FILE_FAIL_IF_EXISTS { String Error_String = SysErrorMessage (GetLastError()); Error_String += ". Возникло при обработке файла: " + S_Src; VOID SetLastError (IN DWORD dwErrCode); Application->NormalizeTopMosts(); #ifdef _DELPHI_STRING_UNICODE Application->MessageBox(Error_String.w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST); #else Application->MessageBox(Error_String.w_str(), L"Копирование файла, каталога (папки)", MB_OK + MB_ICONEXCLAMATION + MB_APPLMODAL + MB_TOPMOST); #endif Application->RestoreTopMosts(); return false; } } } } return true; } catch(...) { return false; }