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