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;