1// WorkDir.cpp 2 3#include "StdAfx.h" 4 5#include "../../../Windows/FileName.h" 6#include "../../../Windows/FileSystem.h" 7 8#include "WorkDir.h" 9 10using namespace NWindows; 11using namespace NFile; 12using namespace NDir; 13 14FString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const FString &path, FString &fileName) 15{ 16 NWorkDir::NMode::EEnum mode = workDirInfo.Mode; 17 18 #if defined(_WIN32) && !defined(UNDER_CE) 19 if (workDirInfo.ForRemovableOnly) 20 { 21 mode = NWorkDir::NMode::kCurrent; 22 const FString prefix = path.Left(3); 23 if (NName::IsDrivePath(prefix)) 24 { 25 const UINT driveType = NSystem::MyGetDriveType(prefix); 26 if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE) 27 mode = workDirInfo.Mode; 28 } 29 /* 30 CParsedPath parsedPath; 31 parsedPath.ParsePath(archiveName); 32 UINT driveType = GetDriveType(parsedPath.Prefix); 33 if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE)) 34 mode = NZipSettings::NWorkDir::NMode::kCurrent; 35 */ 36 } 37 #endif 38 39 const int pos = path.ReverseFind_PathSepar() + 1; 40 fileName = path.Ptr((unsigned)pos); 41 42 FString tempDir; 43 switch ((int)mode) 44 { 45 case NWorkDir::NMode::kCurrent: 46 tempDir = path.Left((unsigned)pos); 47 break; 48 case NWorkDir::NMode::kSpecified: 49 tempDir = workDirInfo.Path; 50 break; 51 // case NWorkDir::NMode::kSystem: 52 default: 53 if (!MyGetTempPath(tempDir)) 54 throw 141717; 55 break; 56 } 57 NName::NormalizeDirPathPrefix(tempDir); 58 return tempDir; 59} 60 61HRESULT CWorkDirTempFile::CreateTempFile(const FString &originalPath) 62{ 63 NWorkDir::CInfo workDirInfo; 64 workDirInfo.Load(); 65 FString namePart; 66 const FString workDir = GetWorkDir(workDirInfo, originalPath, namePart); 67 CreateComplexDir(workDir); 68 _outStreamSpec = new COutFileStream; 69 OutStream = _outStreamSpec; 70 if (!_tempFile.Create(workDir + namePart, &_outStreamSpec->File)) 71 { 72 return GetLastError_noZero_HRESULT(); 73 } 74 _originalPath = originalPath; 75 return S_OK; 76} 77 78HRESULT CWorkDirTempFile::MoveToOriginal(bool deleteOriginal) 79{ 80 OutStream.Release(); 81 if (!_tempFile.MoveTo(_originalPath, deleteOriginal)) 82 { 83 return GetLastError_noZero_HRESULT(); 84 } 85 return S_OK; 86} 87