// ArchiveName.cpp | |
#include "StdAfx.h" | |
#include "../../../Common/Wildcard.h" | |
#include "../../../Windows/FileDir.h" | |
#include "../../../Windows/FileName.h" | |
#include "ExtractingFilePath.h" | |
#include "ArchiveName.h" | |
using namespace NWindows; | |
using namespace NFile; | |
static UString CreateArchiveName(const NFind::CFileInfo &fi, bool keepName) | |
{ | |
FString resultName = fi.Name; | |
if (!fi.IsDir() && !keepName) | |
{ | |
int dotPos = resultName.ReverseFind_Dot(); | |
if (dotPos > 0) | |
{ | |
FString archiveName2 = resultName.Left(dotPos); | |
if (archiveName2.ReverseFind_Dot() < 0) | |
resultName = archiveName2; | |
} | |
} | |
return Get_Correct_FsFile_Name(fs2us(resultName)); | |
} | |
static FString CreateArchiveName2(const FString &path, bool fromPrev, bool keepName) | |
{ | |
FString resultName ("Archive"); | |
if (fromPrev) | |
{ | |
FString dirPrefix; | |
if (NDir::GetOnlyDirPrefix(path, dirPrefix)) | |
{ | |
if (!dirPrefix.IsEmpty() && IsPathSepar(dirPrefix.Back())) | |
{ | |
#if defined(_WIN32) && !defined(UNDER_CE) | |
if (NName::IsDriveRootPath_SuperAllowed(dirPrefix)) | |
resultName = dirPrefix[dirPrefix.Len() - 3]; // only letter | |
else | |
#endif | |
{ | |
dirPrefix.DeleteBack(); | |
NFind::CFileInfo fi; | |
if (fi.Find(dirPrefix)) | |
resultName = fi.Name; | |
} | |
} | |
} | |
} | |
else | |
{ | |
NFind::CFileInfo fi; | |
if (fi.Find(path)) | |
{ | |
resultName = fi.Name; | |
if (!fi.IsDir() && !keepName) | |
{ | |
int dotPos = resultName.ReverseFind_Dot(); | |
if (dotPos > 0) | |
{ | |
FString name2 = resultName.Left(dotPos); | |
if (name2.ReverseFind_Dot() < 0) | |
resultName = name2; | |
} | |
} | |
} | |
} | |
return resultName; | |
} | |
UString CreateArchiveName(const UStringVector &paths, const NFind::CFileInfo *fi) | |
{ | |
bool keepName = false; | |
/* | |
if (paths.Size() == 1) | |
{ | |
const UString &name = paths[0]; | |
if (name.Len() > 4) | |
if (CompareFileNames(name.RightPtr(4), L".tar") == 0) | |
keepName = true; | |
} | |
*/ | |
UString name; | |
if (fi) | |
name = CreateArchiveName(*fi, keepName); | |
else | |
{ | |
if (paths.IsEmpty()) | |
return L"archive"; | |
bool fromPrev = (paths.Size() > 1); | |
name = Get_Correct_FsFile_Name(fs2us(CreateArchiveName2(us2fs(paths.Front()), fromPrev, keepName))); | |
} | |
UString postfix; | |
UInt32 index = 1; | |
for (;;) | |
{ | |
// we don't want cases when we include archive to itself. | |
// so we find first available name for archive | |
const UString name2 = name + postfix; | |
const UString name2_zip = name2 + L".zip"; | |
const UString name2_7z = name2 + L".7z"; | |
const UString name2_tar = name2 + L".tar"; | |
const UString name2_wim = name2 + L".wim"; | |
unsigned i = 0; | |
for (i = 0; i < paths.Size(); i++) | |
{ | |
const UString &fn = paths[i]; | |
NFind::CFileInfo fi2; | |
const NFind::CFileInfo *fp; | |
if (fi && paths.Size() == 1) | |
fp = fi; | |
else | |
{ | |
if (!fi2.Find(us2fs(fn))) | |
continue; | |
fp = &fi2; | |
} | |
const UString fname = fs2us(fp->Name); | |
if ( 0 == CompareFileNames(fname, name2_zip) | |
|| 0 == CompareFileNames(fname, name2_7z) | |
|| 0 == CompareFileNames(fname, name2_tar) | |
|| 0 == CompareFileNames(fname, name2_wim)) | |
break; | |
} | |
if (i == paths.Size()) | |
break; | |
index++; | |
postfix = "_"; | |
postfix.Add_UInt32(index); | |
} | |
name += postfix; | |
return name; | |
} |