You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.6 KiB
149 lines
3.6 KiB
// 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;
|
|
}
|