diff options
Diffstat (limited to 'CPP/7zip/UI/Common/WorkDir.cpp')
-rwxr-xr-x | CPP/7zip/UI/Common/WorkDir.cpp | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/CPP/7zip/UI/Common/WorkDir.cpp b/CPP/7zip/UI/Common/WorkDir.cpp index 164118e2..1ecb5b54 100755 --- a/CPP/7zip/UI/Common/WorkDir.cpp +++ b/CPP/7zip/UI/Common/WorkDir.cpp @@ -5,23 +5,23 @@ #include "Common/StringConvert.h" #include "Common/Wildcard.h" -#include "Windows/FileDir.h" #include "Windows/FileName.h" #include "WorkDir.h" using namespace NWindows; using namespace NFile; +using namespace NDirectory; -UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path) +FString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const FString &path, FString &fileName) { NWorkDir::NMode::EEnum mode = workDirInfo.Mode; #ifndef UNDER_CE if (workDirInfo.ForRemovableOnly) { mode = NWorkDir::NMode::kCurrent; - UString prefix = path.Left(3); - if (prefix[1] == L':' && prefix[2] == L'\\') + FString prefix = path.Left(3); + if (prefix[1] == FTEXT(':') && prefix[2] == FTEXT('\\')) { UINT driveType = GetDriveType(GetSystemString(prefix, ::AreFileApisANSI() ? CP_ACP : CP_OEMCP)); if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE) @@ -36,24 +36,56 @@ UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path) */ } #endif - switch(mode) + int pos = path.ReverseFind(FCHAR_PATH_SEPARATOR) + 1; + fileName = path.Mid(pos); + switch (mode) { case NWorkDir::NMode::kCurrent: { - return ExtractDirPrefixFromPath(path); + return path.Left(pos);; } case NWorkDir::NMode::kSpecified: { - UString tempDir = workDirInfo.Path; + FString tempDir = workDirInfo.Path; NName::NormalizeDirPathPrefix(tempDir); return tempDir; } default: { - UString tempDir; - if (!NDirectory::MyGetTempPath(tempDir)) + FString tempDir; + if (!MyGetTempPath(tempDir)) throw 141717; return tempDir; } } } + +HRESULT CWorkDirTempFile::CreateTempFile(const FString &originalPath) +{ + NWorkDir::CInfo workDirInfo; + workDirInfo.Load(); + FString namePart; + FString workDir = GetWorkDir(workDirInfo, originalPath, namePart); + CreateComplexDirectory(workDir); + CTempFile tempFile; + _outStreamSpec = new COutFileStream; + OutStream = _outStreamSpec; + if (!_tempFile.Create(workDir + namePart, &_outStreamSpec->File)) + { + DWORD error = GetLastError(); + return error ? error : E_FAIL; + } + _originalPath = originalPath; + return S_OK; +} + +HRESULT CWorkDirTempFile::MoveToOriginal(bool deleteOriginal) +{ + OutStream.Release(); + if (!_tempFile.MoveTo(_originalPath, deleteOriginal)) + { + DWORD error = GetLastError(); + return error ? error : E_FAIL; + } + return S_OK; +} |