Home | History | Annotate | Download | only in Common
      1 // FilePathAutoRename.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "../../Common/Defs.h"
      6 #include "../../Common/IntToString.h"
      7 
      8 #include "../../Windows/FileFind.h"
      9 
     10 #include "FilePathAutoRename.h"
     11 
     12 using namespace NWindows;
     13 
     14 static bool MakeAutoName(const FString &name,
     15     const FString &extension, unsigned value, FString &path)
     16 {
     17   FChar number[16];
     18   ConvertUInt32ToString(value, number);
     19   path = name;
     20   path += number;
     21   path += extension;
     22   return NFile::NFind::DoesFileOrDirExist(path);
     23 }
     24 
     25 bool AutoRenamePath(FString &fullProcessedPath)
     26 {
     27   FString path;
     28   int dotPos = fullProcessedPath.ReverseFind(FTEXT('.'));
     29 
     30   int slashPos = fullProcessedPath.ReverseFind(FTEXT('/'));
     31   #ifdef _WIN32
     32   int slash1Pos = fullProcessedPath.ReverseFind(FTEXT('\\'));
     33   slashPos = MyMax(slashPos, slash1Pos);
     34   #endif
     35 
     36   FString name, extension;
     37   if (dotPos > slashPos && dotPos > 0)
     38   {
     39     name.SetFrom(fullProcessedPath, dotPos);
     40     extension = fullProcessedPath.Ptr(dotPos);
     41   }
     42   else
     43     name = fullProcessedPath;
     44   name += L'_';
     45   unsigned left = 1, right = (1 << 30);
     46   while (left != right)
     47   {
     48     unsigned mid = (left + right) / 2;
     49     if (MakeAutoName(name, extension, mid, path))
     50       left = mid + 1;
     51     else
     52       right = mid;
     53   }
     54   return !MakeAutoName(name, extension, right, fullProcessedPath);
     55 }
     56