// FilePathAutoRename.cpp | |
#include "StdAfx.h" | |
#include "Common/Defs.h" | |
#include "Common/IntToString.h" | |
#include "Windows/FileFind.h" | |
#include "FilePathAutoRename.h" | |
using namespace NWindows; | |
static bool MakeAutoName(const UString &name, | |
const UString &extension, unsigned value, UString &path) | |
{ | |
wchar_t number[16]; | |
ConvertUInt32ToString(value, number); | |
path = name; | |
path += number; | |
path += extension; | |
return NFile::NFind::DoesFileOrDirExist(path); | |
} | |
bool AutoRenamePath(UString &fullProcessedPath) | |
{ | |
UString path; | |
int dotPos = fullProcessedPath.ReverseFind(L'.'); | |
int slashPos = fullProcessedPath.ReverseFind(L'/'); | |
#ifdef _WIN32 | |
int slash1Pos = fullProcessedPath.ReverseFind(L'\\'); | |
slashPos = MyMax(slashPos, slash1Pos); | |
#endif | |
UString name, extension; | |
if (dotPos > slashPos && dotPos > 0) | |
{ | |
name = fullProcessedPath.Left(dotPos); | |
extension = fullProcessedPath.Mid(dotPos); | |
} | |
else | |
name = fullProcessedPath; | |
name += L'_'; | |
unsigned left = 1, right = (1 << 30); | |
while (left != right) | |
{ | |
unsigned mid = (left + right) / 2; | |
if (MakeAutoName(name, extension, mid, path)) | |
left = mid + 1; | |
else | |
right = mid; | |
} | |
return !MakeAutoName(name, extension, right, fullProcessedPath); | |
} |