Files

87 lines
2.2 KiB
C++
Raw Permalink Normal View History

2021-10-19 21:27:23 +01:00
// WorkDir.cpp
#include "StdAfx.h"
#include "../../../Windows/FileName.h"
2023-09-24 03:13:03 +01:00
#include "../../../Windows/FileSystem.h"
2021-10-19 21:27:23 +01:00
#include "WorkDir.h"
using namespace NWindows;
using namespace NFile;
using namespace NDir;
FString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const FString &path, FString &fileName)
{
NWorkDir::NMode::EEnum mode = workDirInfo.Mode;
#if defined(_WIN32) && !defined(UNDER_CE)
if (workDirInfo.ForRemovableOnly)
{
mode = NWorkDir::NMode::kCurrent;
2023-09-24 03:13:03 +01:00
const FString prefix = path.Left(3);
if (NName::IsDrivePath(prefix))
2021-10-19 21:27:23 +01:00
{
2023-09-24 03:13:03 +01:00
const UINT driveType = NSystem::MyGetDriveType(prefix);
2021-10-19 21:27:23 +01:00
if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE)
mode = workDirInfo.Mode;
}
/*
CParsedPath parsedPath;
parsedPath.ParsePath(archiveName);
UINT driveType = GetDriveType(parsedPath.Prefix);
if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE))
mode = NZipSettings::NWorkDir::NMode::kCurrent;
*/
}
#endif
2023-09-24 03:13:03 +01:00
const int pos = path.ReverseFind_PathSepar() + 1;
2021-10-19 21:27:23 +01:00
fileName = path.Ptr((unsigned)pos);
2023-09-24 03:13:03 +01:00
FString tempDir;
switch ((int)mode)
2021-10-19 21:27:23 +01:00
{
case NWorkDir::NMode::kCurrent:
2023-09-24 03:13:03 +01:00
tempDir = path.Left((unsigned)pos);
break;
2021-10-19 21:27:23 +01:00
case NWorkDir::NMode::kSpecified:
2023-09-24 03:13:03 +01:00
tempDir = workDirInfo.Path;
break;
// case NWorkDir::NMode::kSystem:
2021-10-19 21:27:23 +01:00
default:
if (!MyGetTempPath(tempDir))
throw 141717;
2023-09-24 03:13:03 +01:00
break;
2021-10-19 21:27:23 +01:00
}
2023-09-24 03:13:03 +01:00
NName::NormalizeDirPathPrefix(tempDir);
return tempDir;
2021-10-19 21:27:23 +01:00
}
HRESULT CWorkDirTempFile::CreateTempFile(const FString &originalPath)
{
NWorkDir::CInfo workDirInfo;
workDirInfo.Load();
FString namePart;
2023-09-24 03:13:03 +01:00
const FString workDir = GetWorkDir(workDirInfo, originalPath, namePart);
2021-10-19 21:27:23 +01:00
CreateComplexDir(workDir);
_outStreamSpec = new COutFileStream;
OutStream = _outStreamSpec;
if (!_tempFile.Create(workDir + namePart, &_outStreamSpec->File))
{
return GetLastError_noZero_HRESULT();
}
_originalPath = originalPath;
return S_OK;
}
HRESULT CWorkDirTempFile::MoveToOriginal(bool deleteOriginal)
{
OutStream.Release();
if (!_tempFile.MoveTo(_originalPath, deleteOriginal))
{
return GetLastError_noZero_HRESULT();
}
return S_OK;
}