// 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 FString &name, const FString &extension, unsigned value, FString &path) { FChar number[16]; ConvertUInt32ToString(value, number); path = name; path += number; path += extension; return NFile::NFind::DoesFileOrDirExist(path); } bool AutoRenamePath(FString &fullProcessedPath) { FString path; int dotPos = fullProcessedPath.ReverseFind(FTEXT('.')); int slashPos = fullProcessedPath.ReverseFind(FTEXT('/')); #ifdef _WIN32 int slash1Pos = fullProcessedPath.ReverseFind(FTEXT('\\')); slashPos = MyMax(slashPos, slash1Pos); #endif FString name, extension; if (dotPos > slashPos && dotPos > 0) { name.SetFrom(fullProcessedPath, dotPos); extension = fullProcessedPath.Ptr(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); }