modules/jdk.packager/src/main/native/library/common/FilePath.cpp

Print this page

        

*** 47,57 **** bool FilePath::FileExists(const TString FileName) { bool result = false; #ifdef WINDOWS WIN32_FIND_DATA FindFileData; ! HANDLE handle = FindFirstFile(FileName.data(), &FindFileData); if (handle != INVALID_HANDLE_VALUE) { if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) { result = true; } --- 47,58 ---- bool FilePath::FileExists(const TString FileName) { bool result = false; #ifdef WINDOWS WIN32_FIND_DATA FindFileData; ! TString fileName = FixPathForPlatform(FileName); ! HANDLE handle = FindFirstFile(fileName.data(), &FindFileData); if (handle != INVALID_HANDLE_VALUE) { if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) { result = true; }
*** 74,84 **** bool FilePath::DirectoryExists(const TString DirectoryName) { bool result = false; #ifdef WINDOWS WIN32_FIND_DATA FindFileData; ! HANDLE handle = FindFirstFile(DirectoryName.data(), &FindFileData); if (handle != INVALID_HANDLE_VALUE) { if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) { result = true; } --- 75,86 ---- bool FilePath::DirectoryExists(const TString DirectoryName) { bool result = false; #ifdef WINDOWS WIN32_FIND_DATA FindFileData; ! TString directoryName = FixPathForPlatform(DirectoryName); ! HANDLE handle = FindFirstFile(directoryName.data(), &FindFileData); if (handle != INVALID_HANDLE_VALUE) { if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) { result = true; }
*** 121,131 **** bool FilePath::DeleteFile(const TString FileName) { bool result = false; if (FileExists(FileName) == true) { #ifdef WINDOWS ! TString lFileName = FileName; FileAttributes attributes(lFileName); if (attributes.Contains(faReadOnly) == true) { attributes.Remove(faReadOnly); } --- 123,133 ---- bool FilePath::DeleteFile(const TString FileName) { bool result = false; if (FileExists(FileName) == true) { #ifdef WINDOWS ! TString lFileName = FixPathForPlatform(FileName); FileAttributes attributes(lFileName); if (attributes.Contains(faReadOnly) == true) { attributes.Remove(faReadOnly); }
*** 146,158 **** bool result = false; if (DirectoryExists(DirectoryName) == true) { #ifdef WINDOWS SHFILEOPSTRUCTW fos = {0}; ! DynamicBuffer<TCHAR> lDirectoryName(DirectoryName.size() + 2); ! memcpy(lDirectoryName.GetData(), DirectoryName.data(), (DirectoryName.size() + 2) * sizeof(TCHAR)); ! lDirectoryName[DirectoryName.size() + 1] = NULL; // Double null terminate for SHFileOperation. // Delete the folder and everything inside. fos.wFunc = FO_DELETE; fos.pFrom = lDirectoryName.GetData(); fos.fFlags = FOF_NO_UI; --- 148,161 ---- bool result = false; if (DirectoryExists(DirectoryName) == true) { #ifdef WINDOWS SHFILEOPSTRUCTW fos = {0}; ! TString directoryName = FixPathForPlatform(DirectoryName); ! DynamicBuffer<TCHAR> lDirectoryName(directoryName.size() + 2); ! memcpy(lDirectoryName.GetData(), directoryName.data(), (directoryName.size() + 2) * sizeof(TCHAR)); ! lDirectoryName[directoryName.size() + 1] = NULL; // Double null terminate for SHFileOperation. // Delete the folder and everything inside. fos.wFunc = FO_DELETE; fos.pFrom = lDirectoryName.GetData(); fos.fFlags = FOF_NO_UI;
*** 248,257 **** --- 251,278 ---- } TString FilePath::FixPathForPlatform(TString Path) { TString result = Path; std::replace(result.begin(), result.end(), BAD_TRAILING_PATHSEPARATOR, TRAILING_PATHSEPARATOR); + #ifdef WINDOWS + // The maximum path that does not require long path prefix. On Windows the + // maximum path is 260 minus 1 (NUL) but for directories it is 260 minus + // 12 minus 1 (to allow for the creation of a 8.3 file in the directory). + const int maxPath = 247; + if (result.length() > maxPath && + result.find(_T("\\\\?\\")) == TString::npos && + result.find(_T("\\\\?\\UNC")) == TString::npos) { + const TString prefix(_T("\\\\")); + if (!result.compare(0, prefix.size(), prefix)) { + // UNC path, converting to UNC path in long notation + result = _T("\\\\?\\UNC") + result.substr(1, result.length()); + } else { + // converting to non-UNC path in long notation + result = _T("\\\\?\\") + result; + } + } + #endif // WINDOWS return result; } TString FilePath::FixPathSeparatorForPlatform(TString Path) { TString result = Path;