| Index: third_party/lzma/v4_65/files/CPP/Windows/FileDir.cpp
|
| diff --git a/third_party/lzma/v4_65/files/CPP/Windows/FileDir.cpp b/third_party/lzma/v4_65/files/CPP/Windows/FileDir.cpp
|
| deleted file mode 100644
|
| index 4224d6fae71829e4bbd38d8e6fcf4aaf3aa5ef47..0000000000000000000000000000000000000000
|
| --- a/third_party/lzma/v4_65/files/CPP/Windows/FileDir.cpp
|
| +++ /dev/null
|
| @@ -1,841 +0,0 @@
|
| -// Windows/FileDir.cpp
|
| -
|
| -#include "StdAfx.h"
|
| -
|
| -#include "FileDir.h"
|
| -#include "FileName.h"
|
| -#include "FileFind.h"
|
| -#include "Defs.h"
|
| -#ifndef _UNICODE
|
| -#include "../Common/StringConvert.h"
|
| -#endif
|
| -
|
| -#ifndef _UNICODE
|
| -extern bool g_IsNT;
|
| -#endif
|
| -
|
| -namespace NWindows {
|
| -namespace NFile {
|
| -
|
| -#if defined(WIN_LONG_PATH) && defined(_UNICODE)
|
| -#define WIN_LONG_PATH2
|
| -#endif
|
| -
|
| -// SetCurrentDirectory doesn't support \\?\ prefix
|
| -
|
| -#ifdef WIN_LONG_PATH
|
| -bool GetLongPathBase(LPCWSTR fileName, UString &res);
|
| -bool GetLongPath(LPCWSTR fileName, UString &res);
|
| -#endif
|
| -
|
| -namespace NDirectory {
|
| -
|
| -#ifndef _UNICODE
|
| -static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; }
|
| -static UString GetUnicodePath(const CSysString &sysPath)
|
| - { return MultiByteToUnicodeString(sysPath, GetCurrentCodePage()); }
|
| -static CSysString GetSysPath(LPCWSTR sysPath)
|
| - { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); }
|
| -#endif
|
| -
|
| -bool MyGetWindowsDirectory(CSysString &path)
|
| -{
|
| - UINT needLength = ::GetWindowsDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1);
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| -}
|
| -
|
| -bool MyGetSystemDirectory(CSysString &path)
|
| -{
|
| - UINT needLength = ::GetSystemDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1);
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MyGetWindowsDirectory(UString &path)
|
| -{
|
| - if (g_IsNT)
|
| - {
|
| - UINT needLength = ::GetWindowsDirectoryW(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1);
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| - }
|
| - CSysString sysPath;
|
| - if (!MyGetWindowsDirectory(sysPath))
|
| - return false;
|
| - path = GetUnicodePath(sysPath);
|
| - return true;
|
| -}
|
| -
|
| -bool MyGetSystemDirectory(UString &path)
|
| -{
|
| - if (g_IsNT)
|
| - {
|
| - UINT needLength = ::GetSystemDirectoryW(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1);
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| - }
|
| - CSysString sysPath;
|
| - if (!MyGetSystemDirectory(sysPath))
|
| - return false;
|
| - path = GetUnicodePath(sysPath);
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -bool SetDirTime(LPCWSTR fileName, const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime)
|
| -{
|
| - #ifndef _UNICODE
|
| - if (!g_IsNT)
|
| - {
|
| - ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
| - return false;
|
| - }
|
| - #endif
|
| - HANDLE hDir = ::CreateFileW(fileName, GENERIC_WRITE,
|
| - FILE_SHARE_READ | FILE_SHARE_WRITE,
|
| - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
| - #ifdef WIN_LONG_PATH
|
| - if (hDir == INVALID_HANDLE_VALUE)
|
| - {
|
| - UString longPath;
|
| - if (GetLongPath(fileName, longPath))
|
| - hDir = ::CreateFileW(longPath, GENERIC_WRITE,
|
| - FILE_SHARE_READ | FILE_SHARE_WRITE,
|
| - NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
| - }
|
| - #endif
|
| -
|
| - bool res = false;
|
| - if (hDir != INVALID_HANDLE_VALUE)
|
| - {
|
| - res = BOOLToBool(::SetFileTime(hDir, cTime, aTime, mTime));
|
| - ::CloseHandle(hDir);
|
| - }
|
| - return res;
|
| -}
|
| -
|
| -bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes)
|
| -{
|
| - if (::SetFileAttributes(fileName, fileAttributes))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH2
|
| - UString longPath;
|
| - if (GetLongPath(fileName, longPath))
|
| - return BOOLToBool(::SetFileAttributesW(longPath, fileAttributes));
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -bool MyRemoveDirectory(LPCTSTR pathName)
|
| -{
|
| - if (::RemoveDirectory(pathName))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH2
|
| - UString longPath;
|
| - if (GetLongPath(pathName, longPath))
|
| - return BOOLToBool(::RemoveDirectoryW(longPath));
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -#ifdef WIN_LONG_PATH
|
| -bool GetLongPaths(LPCWSTR s1, LPCWSTR s2, UString &d1, UString &d2)
|
| -{
|
| - if (!GetLongPathBase(s1, d1) || !GetLongPathBase(s2, d2))
|
| - return false;
|
| - if (d1.IsEmpty() && d2.IsEmpty()) return false;
|
| - if (d1.IsEmpty()) d1 = s1;
|
| - if (d2.IsEmpty()) d2 = s2;
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName)
|
| -{
|
| - if (::MoveFile(existFileName, newFileName))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH2
|
| - UString d1, d2;
|
| - if (GetLongPaths(existFileName, newFileName, d1, d2))
|
| - return BOOLToBool(::MoveFileW(d1, d2));
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes)
|
| -{
|
| - if (!g_IsNT)
|
| - return MySetFileAttributes(GetSysPath(fileName), fileAttributes);
|
| - if (::SetFileAttributesW(fileName, fileAttributes))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH
|
| - UString longPath;
|
| - if (GetLongPath(fileName, longPath))
|
| - return BOOLToBool(::SetFileAttributesW(longPath, fileAttributes));
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -
|
| -bool MyRemoveDirectory(LPCWSTR pathName)
|
| -{
|
| - if (!g_IsNT)
|
| - return MyRemoveDirectory(GetSysPath(pathName));
|
| - if (::RemoveDirectoryW(pathName))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH
|
| - UString longPath;
|
| - if (GetLongPath(pathName, longPath))
|
| - return BOOLToBool(::RemoveDirectoryW(longPath));
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -bool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName)
|
| -{
|
| - if (!g_IsNT)
|
| - return MyMoveFile(GetSysPath(existFileName), GetSysPath(newFileName));
|
| - if (::MoveFileW(existFileName, newFileName))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH
|
| - UString d1, d2;
|
| - if (GetLongPaths(existFileName, newFileName, d1, d2))
|
| - return BOOLToBool(::MoveFileW(d1, d2));
|
| - #endif
|
| - return false;
|
| -}
|
| -#endif
|
| -
|
| -bool MyCreateDirectory(LPCTSTR pathName)
|
| -{
|
| - if (::CreateDirectory(pathName, NULL))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH2
|
| - if (::GetLastError() != ERROR_ALREADY_EXISTS)
|
| - {
|
| - UString longPath;
|
| - if (GetLongPath(pathName, longPath))
|
| - return BOOLToBool(::CreateDirectoryW(longPath, NULL));
|
| - }
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MyCreateDirectory(LPCWSTR pathName)
|
| -{
|
| - if (!g_IsNT)
|
| - return MyCreateDirectory(GetSysPath(pathName));
|
| - if (::CreateDirectoryW(pathName, NULL))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH
|
| - if (::GetLastError() != ERROR_ALREADY_EXISTS)
|
| - {
|
| - UString longPath;
|
| - if (GetLongPath(pathName, longPath))
|
| - return BOOLToBool(::CreateDirectoryW(longPath, NULL));
|
| - }
|
| - #endif
|
| - return false;
|
| -}
|
| -#endif
|
| -
|
| -/*
|
| -bool CreateComplexDirectory(LPCTSTR pathName)
|
| -{
|
| - NName::CParsedPath path;
|
| - path.ParsePath(pathName);
|
| - CSysString fullPath = path.Prefix;
|
| - DWORD errorCode = ERROR_SUCCESS;
|
| - for (int i = 0; i < path.PathParts.Size(); i++)
|
| - {
|
| - const CSysString &string = path.PathParts[i];
|
| - if (string.IsEmpty())
|
| - {
|
| - if (i != path.PathParts.Size() - 1)
|
| - return false;
|
| - return true;
|
| - }
|
| - fullPath += path.PathParts[i];
|
| - if (!MyCreateDirectory(fullPath))
|
| - {
|
| - DWORD errorCode = GetLastError();
|
| - if (errorCode != ERROR_ALREADY_EXISTS)
|
| - return false;
|
| - }
|
| - fullPath += NName::kDirDelimiter;
|
| - }
|
| - return true;
|
| -}
|
| -*/
|
| -
|
| -bool CreateComplexDirectory(LPCTSTR _aPathName)
|
| -{
|
| - CSysString pathName = _aPathName;
|
| - int pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR));
|
| - if (pos > 0 && pos == pathName.Length() - 1)
|
| - {
|
| - if (pathName.Length() == 3 && pathName[1] == ':')
|
| - return true; // Disk folder;
|
| - pathName.Delete(pos);
|
| - }
|
| - CSysString pathName2 = pathName;
|
| - pos = pathName.Length();
|
| - for (;;)
|
| - {
|
| - if (MyCreateDirectory(pathName))
|
| - break;
|
| - if (::GetLastError() == ERROR_ALREADY_EXISTS)
|
| - {
|
| - NFind::CFileInfo fileInfo;
|
| - if (!NFind::FindFile(pathName, fileInfo)) // For network folders
|
| - return true;
|
| - if (!fileInfo.IsDir())
|
| - return false;
|
| - break;
|
| - }
|
| - pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR));
|
| - if (pos < 0 || pos == 0)
|
| - return false;
|
| - if (pathName[pos - 1] == ':')
|
| - return false;
|
| - pathName = pathName.Left(pos);
|
| - }
|
| - pathName = pathName2;
|
| - while (pos < pathName.Length())
|
| - {
|
| - pos = pathName.Find(TEXT(CHAR_PATH_SEPARATOR), pos + 1);
|
| - if (pos < 0)
|
| - pos = pathName.Length();
|
| - if (!MyCreateDirectory(pathName.Left(pos)))
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -
|
| -bool CreateComplexDirectory(LPCWSTR _aPathName)
|
| -{
|
| - UString pathName = _aPathName;
|
| - int pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR);
|
| - if (pos > 0 && pos == pathName.Length() - 1)
|
| - {
|
| - if (pathName.Length() == 3 && pathName[1] == L':')
|
| - return true; // Disk folder;
|
| - pathName.Delete(pos);
|
| - }
|
| - UString pathName2 = pathName;
|
| - pos = pathName.Length();
|
| - for (;;)
|
| - {
|
| - if (MyCreateDirectory(pathName))
|
| - break;
|
| - if (::GetLastError() == ERROR_ALREADY_EXISTS)
|
| - {
|
| - NFind::CFileInfoW fileInfo;
|
| - if (!NFind::FindFile(pathName, fileInfo)) // For network folders
|
| - return true;
|
| - if (!fileInfo.IsDir())
|
| - return false;
|
| - break;
|
| - }
|
| - pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR);
|
| - if (pos < 0 || pos == 0)
|
| - return false;
|
| - if (pathName[pos - 1] == L':')
|
| - return false;
|
| - pathName = pathName.Left(pos);
|
| - }
|
| - pathName = pathName2;
|
| - while (pos < pathName.Length())
|
| - {
|
| - pos = pathName.Find(WCHAR_PATH_SEPARATOR, pos + 1);
|
| - if (pos < 0)
|
| - pos = pathName.Length();
|
| - if (!MyCreateDirectory(pathName.Left(pos)))
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -#endif
|
| -
|
| -bool DeleteFileAlways(LPCTSTR name)
|
| -{
|
| - if (!MySetFileAttributes(name, 0))
|
| - return false;
|
| - if (::DeleteFile(name))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH2
|
| - UString longPath;
|
| - if (GetLongPath(name, longPath))
|
| - return BOOLToBool(::DeleteFileW(longPath));
|
| - #endif
|
| - return false;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool DeleteFileAlways(LPCWSTR name)
|
| -{
|
| - if (!g_IsNT)
|
| - return DeleteFileAlways(GetSysPath(name));
|
| - if (!MySetFileAttributes(name, 0))
|
| - return false;
|
| - if (::DeleteFileW(name))
|
| - return true;
|
| - #ifdef WIN_LONG_PATH
|
| - UString longPath;
|
| - if (GetLongPath(name, longPath))
|
| - return BOOLToBool(::DeleteFileW(longPath));
|
| - #endif
|
| - return false;
|
| -}
|
| -#endif
|
| -
|
| -static bool RemoveDirectorySubItems2(const CSysString pathPrefix, const NFind::CFileInfo &fileInfo)
|
| -{
|
| - if (fileInfo.IsDir())
|
| - return RemoveDirectoryWithSubItems(pathPrefix + fileInfo.Name);
|
| - return DeleteFileAlways(pathPrefix + fileInfo.Name);
|
| -}
|
| -
|
| -bool RemoveDirectoryWithSubItems(const CSysString &path)
|
| -{
|
| - NFind::CFileInfo fileInfo;
|
| - CSysString pathPrefix = path + NName::kDirDelimiter;
|
| - {
|
| - NFind::CEnumerator enumerator(pathPrefix + TCHAR(NName::kAnyStringWildcard));
|
| - while (enumerator.Next(fileInfo))
|
| - if (!RemoveDirectorySubItems2(pathPrefix, fileInfo))
|
| - return false;
|
| - }
|
| - if (!MySetFileAttributes(path, 0))
|
| - return false;
|
| - return MyRemoveDirectory(path);
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -static bool RemoveDirectorySubItems2(const UString pathPrefix, const NFind::CFileInfoW &fileInfo)
|
| -{
|
| - if (fileInfo.IsDir())
|
| - return RemoveDirectoryWithSubItems(pathPrefix + fileInfo.Name);
|
| - return DeleteFileAlways(pathPrefix + fileInfo.Name);
|
| -}
|
| -bool RemoveDirectoryWithSubItems(const UString &path)
|
| -{
|
| - NFind::CFileInfoW fileInfo;
|
| - UString pathPrefix = path + UString(NName::kDirDelimiter);
|
| - {
|
| - NFind::CEnumeratorW enumerator(pathPrefix + UString(NName::kAnyStringWildcard));
|
| - while (enumerator.Next(fileInfo))
|
| - if (!RemoveDirectorySubItems2(pathPrefix, fileInfo))
|
| - return false;
|
| - }
|
| - if (!MySetFileAttributes(path, 0))
|
| - return false;
|
| - return MyRemoveDirectory(path);
|
| -}
|
| -#endif
|
| -
|
| -#ifndef _WIN32_WCE
|
| -
|
| -bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath)
|
| -{
|
| - DWORD needLength = ::GetShortPathName(longPath, shortPath.GetBuffer(MAX_PATH + 1), MAX_PATH + 1);
|
| - shortPath.ReleaseBuffer();
|
| - return (needLength > 0 && needLength < MAX_PATH);
|
| -}
|
| -
|
| -bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, int &fileNamePartStartIndex)
|
| -{
|
| - resultPath.Empty();
|
| - LPTSTR fileNamePointer = 0;
|
| - LPTSTR buffer = resultPath.GetBuffer(MAX_PATH);
|
| - DWORD needLength = ::GetFullPathName(fileName, MAX_PATH + 1, buffer, &fileNamePointer);
|
| - resultPath.ReleaseBuffer();
|
| - if (needLength == 0)
|
| - return false;
|
| - if (needLength >= MAX_PATH)
|
| - {
|
| - #ifdef WIN_LONG_PATH2
|
| - needLength++;
|
| - buffer = resultPath.GetBuffer(needLength + 1);
|
| - DWORD needLength2 = ::GetFullPathNameW(fileName, needLength, buffer, &fileNamePointer);
|
| - resultPath.ReleaseBuffer();
|
| - if (needLength2 == 0 || needLength2 > needLength)
|
| - #endif
|
| - return false;
|
| - }
|
| - if (fileNamePointer == 0)
|
| - fileNamePartStartIndex = lstrlen(fileName);
|
| - else
|
| - fileNamePartStartIndex = (int)(fileNamePointer - buffer);
|
| - return true;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, int &fileNamePartStartIndex)
|
| -{
|
| - resultPath.Empty();
|
| - if (g_IsNT)
|
| - {
|
| - LPWSTR fileNamePointer = 0;
|
| - LPWSTR buffer = resultPath.GetBuffer(MAX_PATH);
|
| - DWORD needLength = ::GetFullPathNameW(fileName, MAX_PATH + 1, buffer, &fileNamePointer);
|
| - resultPath.ReleaseBuffer();
|
| - if (needLength == 0)
|
| - return false;
|
| - if (needLength >= MAX_PATH)
|
| - {
|
| - #ifdef WIN_LONG_PATH
|
| - needLength++;
|
| - buffer = resultPath.GetBuffer(needLength + 1);
|
| - DWORD needLength2 = ::GetFullPathNameW(fileName, needLength, buffer, &fileNamePointer);
|
| - resultPath.ReleaseBuffer();
|
| - if (needLength2 == 0 || needLength2 > needLength)
|
| - #endif
|
| - return false;
|
| - }
|
| - if (fileNamePointer == 0)
|
| - fileNamePartStartIndex = MyStringLen(fileName);
|
| - else
|
| - fileNamePartStartIndex = (int)(fileNamePointer - buffer);
|
| - }
|
| - else
|
| - {
|
| - CSysString sysPath;
|
| - if (!MyGetFullPathName(GetSysPath(fileName), sysPath, fileNamePartStartIndex))
|
| - return false;
|
| - UString resultPath1 = GetUnicodePath(sysPath.Left(fileNamePartStartIndex));
|
| - UString resultPath2 = GetUnicodePath(sysPath.Mid(fileNamePartStartIndex));
|
| - fileNamePartStartIndex = resultPath1.Length();
|
| - resultPath = resultPath1 + resultPath2;
|
| - }
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -
|
| -bool MyGetFullPathName(LPCTSTR fileName, CSysString &path)
|
| -{
|
| - int index;
|
| - return MyGetFullPathName(fileName, path, index);
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MyGetFullPathName(LPCWSTR fileName, UString &path)
|
| -{
|
| - int index;
|
| - return MyGetFullPathName(fileName, path, index);
|
| -}
|
| -#endif
|
| -
|
| -bool GetOnlyName(LPCTSTR fileName, CSysString &resultName)
|
| -{
|
| - int index;
|
| - if (!MyGetFullPathName(fileName, resultName, index))
|
| - return false;
|
| - resultName = resultName.Mid(index);
|
| - return true;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool GetOnlyName(LPCWSTR fileName, UString &resultName)
|
| -{
|
| - int index;
|
| - if (!MyGetFullPathName(fileName, resultName, index))
|
| - return false;
|
| - resultName = resultName.Mid(index);
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName)
|
| -{
|
| - int index;
|
| - if (!MyGetFullPathName(fileName, resultName, index))
|
| - return false;
|
| - resultName = resultName.Left(index);
|
| - return true;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool GetOnlyDirPrefix(LPCWSTR fileName, UString &resultName)
|
| -{
|
| - int index;
|
| - if (!MyGetFullPathName(fileName, resultName, index))
|
| - return false;
|
| - resultName = resultName.Left(index);
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -bool MyGetCurrentDirectory(CSysString &path)
|
| -{
|
| - DWORD needLength = ::GetCurrentDirectory(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1));
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MySetCurrentDirectory(LPCWSTR path)
|
| -{
|
| - if (g_IsNT)
|
| - return BOOLToBool(::SetCurrentDirectoryW(path));
|
| - return MySetCurrentDirectory(GetSysPath(path));
|
| -}
|
| -bool MyGetCurrentDirectory(UString &path)
|
| -{
|
| - if (g_IsNT)
|
| - {
|
| - DWORD needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1));
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| - }
|
| - CSysString sysPath;
|
| - if (!MyGetCurrentDirectory(sysPath))
|
| - return false;
|
| - path = GetUnicodePath(sysPath);
|
| - return true;
|
| -}
|
| -#endif
|
| -#endif
|
| -
|
| -bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension,
|
| - CSysString &resultPath, UINT32 &filePart)
|
| -{
|
| - LPTSTR filePartPointer;
|
| - DWORD value = ::SearchPath(path, fileName, extension,
|
| - MAX_PATH, resultPath.GetBuffer(MAX_PATH + 1), &filePartPointer);
|
| - filePart = (UINT32)(filePartPointer - (LPCTSTR)resultPath);
|
| - resultPath.ReleaseBuffer();
|
| - return (value > 0 && value <= MAX_PATH);
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension,
|
| - UString &resultPath, UINT32 &filePart)
|
| -{
|
| - if (g_IsNT)
|
| - {
|
| - LPWSTR filePartPointer = 0;
|
| - DWORD value = ::SearchPathW(path, fileName, extension,
|
| - MAX_PATH, resultPath.GetBuffer(MAX_PATH + 1), &filePartPointer);
|
| - filePart = (UINT32)(filePartPointer - (LPCWSTR)resultPath);
|
| - resultPath.ReleaseBuffer();
|
| - return (value > 0 && value <= MAX_PATH);
|
| - }
|
| -
|
| - CSysString sysPath;
|
| - if (!MySearchPath(
|
| - path != 0 ? (LPCTSTR)GetSysPath(path): 0,
|
| - fileName != 0 ? (LPCTSTR)GetSysPath(fileName): 0,
|
| - extension != 0 ? (LPCTSTR)GetSysPath(extension): 0,
|
| - sysPath, filePart))
|
| - return false;
|
| - UString resultPath1 = GetUnicodePath(sysPath.Left(filePart));
|
| - UString resultPath2 = GetUnicodePath(sysPath.Mid(filePart));
|
| - filePart = resultPath1.Length();
|
| - resultPath = resultPath1 + resultPath2;
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -bool MyGetTempPath(CSysString &path)
|
| -{
|
| - DWORD needLength = ::GetTempPath(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1));
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -bool MyGetTempPath(UString &path)
|
| -{
|
| - path.Empty();
|
| - if (g_IsNT)
|
| - {
|
| - DWORD needLength = ::GetTempPathW(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1));
|
| - path.ReleaseBuffer();
|
| - return (needLength > 0 && needLength <= MAX_PATH);
|
| - }
|
| - CSysString sysPath;
|
| - if (!MyGetTempPath(sysPath))
|
| - return false;
|
| - path = GetUnicodePath(sysPath);
|
| - return true;
|
| -}
|
| -#endif
|
| -
|
| -UINT MyGetTempFileName(LPCTSTR dirPath, LPCTSTR prefix, CSysString &path)
|
| -{
|
| - UINT number = ::GetTempFileName(dirPath, prefix, 0, path.GetBuffer(MAX_PATH + 1));
|
| - path.ReleaseBuffer();
|
| - return number;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -UINT MyGetTempFileName(LPCWSTR dirPath, LPCWSTR prefix, UString &path)
|
| -{
|
| - if (g_IsNT)
|
| - {
|
| - UINT number = ::GetTempFileNameW(dirPath, prefix, 0, path.GetBuffer(MAX_PATH));
|
| - path.ReleaseBuffer();
|
| - return number;
|
| - }
|
| - CSysString sysPath;
|
| - UINT number = MyGetTempFileName(
|
| - dirPath ? (LPCTSTR)GetSysPath(dirPath): 0,
|
| - prefix ? (LPCTSTR)GetSysPath(prefix): 0,
|
| - sysPath);
|
| - path = GetUnicodePath(sysPath);
|
| - return number;
|
| -}
|
| -#endif
|
| -
|
| -UINT CTempFile::Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath)
|
| -{
|
| - Remove();
|
| - UINT number = MyGetTempFileName(dirPath, prefix, resultPath);
|
| - if (number != 0)
|
| - {
|
| - _fileName = resultPath;
|
| - _mustBeDeleted = true;
|
| - }
|
| - return number;
|
| -}
|
| -
|
| -bool CTempFile::Create(LPCTSTR prefix, CSysString &resultPath)
|
| -{
|
| - CSysString tempPath;
|
| - if (!MyGetTempPath(tempPath))
|
| - return false;
|
| - if (Create(tempPath, prefix, resultPath) != 0)
|
| - return true;
|
| - if (!MyGetWindowsDirectory(tempPath))
|
| - return false;
|
| - return (Create(tempPath, prefix, resultPath) != 0);
|
| -}
|
| -
|
| -bool CTempFile::Remove()
|
| -{
|
| - if (!_mustBeDeleted)
|
| - return true;
|
| - _mustBeDeleted = !DeleteFileAlways(_fileName);
|
| - return !_mustBeDeleted;
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -
|
| -UINT CTempFileW::Create(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath)
|
| -{
|
| - Remove();
|
| - UINT number = MyGetTempFileName(dirPath, prefix, resultPath);
|
| - if (number != 0)
|
| - {
|
| - _fileName = resultPath;
|
| - _mustBeDeleted = true;
|
| - }
|
| - return number;
|
| -}
|
| -
|
| -bool CTempFileW::Create(LPCWSTR prefix, UString &resultPath)
|
| -{
|
| - UString tempPath;
|
| - if (!MyGetTempPath(tempPath))
|
| - return false;
|
| - if (Create(tempPath, prefix, resultPath) != 0)
|
| - return true;
|
| - if (!MyGetWindowsDirectory(tempPath))
|
| - return false;
|
| - return (Create(tempPath, prefix, resultPath) != 0);
|
| -}
|
| -
|
| -bool CTempFileW::Remove()
|
| -{
|
| - if (!_mustBeDeleted)
|
| - return true;
|
| - _mustBeDeleted = !DeleteFileAlways(_fileName);
|
| - return !_mustBeDeleted;
|
| -}
|
| -
|
| -#endif
|
| -
|
| -bool CreateTempDirectory(LPCTSTR prefix, CSysString &dirName)
|
| -{
|
| - /*
|
| - CSysString prefix = tempPath + prefixChars;
|
| - CRandom random;
|
| - random.Init();
|
| - */
|
| - for (;;)
|
| - {
|
| - CTempFile tempFile;
|
| - if (!tempFile.Create(prefix, dirName))
|
| - return false;
|
| - if (!::DeleteFile(dirName))
|
| - return false;
|
| - /*
|
| - UINT32 randomNumber = random.Generate();
|
| - TCHAR randomNumberString[32];
|
| - _stprintf(randomNumberString, _T("%04X"), randomNumber);
|
| - dirName = prefix + randomNumberString;
|
| - */
|
| - if (NFind::DoesFileExist(dirName))
|
| - continue;
|
| - if (MyCreateDirectory(dirName))
|
| - return true;
|
| - if (::GetLastError() != ERROR_ALREADY_EXISTS)
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool CTempDirectory::Create(LPCTSTR prefix)
|
| -{
|
| - Remove();
|
| - return (_mustBeDeleted = CreateTempDirectory(prefix, _tempDir));
|
| -}
|
| -
|
| -#ifndef _UNICODE
|
| -
|
| -bool CreateTempDirectory(LPCWSTR prefix, UString &dirName)
|
| -{
|
| - /*
|
| - CSysString prefix = tempPath + prefixChars;
|
| - CRandom random;
|
| - random.Init();
|
| - */
|
| - for (;;)
|
| - {
|
| - CTempFileW tempFile;
|
| - if (!tempFile.Create(prefix, dirName))
|
| - return false;
|
| - if (!DeleteFileAlways(dirName))
|
| - return false;
|
| - /*
|
| - UINT32 randomNumber = random.Generate();
|
| - TCHAR randomNumberString[32];
|
| - _stprintf(randomNumberString, _T("%04X"), randomNumber);
|
| - dirName = prefix + randomNumberString;
|
| - */
|
| - if (NFind::DoesFileExist(dirName))
|
| - continue;
|
| - if (MyCreateDirectory(dirName))
|
| - return true;
|
| - if (::GetLastError() != ERROR_ALREADY_EXISTS)
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool CTempDirectoryW::Create(LPCWSTR prefix)
|
| -{
|
| - Remove();
|
| - return (_mustBeDeleted = CreateTempDirectory(prefix, _tempDir));
|
| -}
|
| -
|
| -#endif
|
| -
|
| -}}}
|
|
|