// Перименовываем, добавляя _2 к имени файла. TString GetNewNameForFileAdd(const TPath &oldPath) { TString uniquePath; const int SIMILAR_PREFIX_SIZE = 16; const TChar *SIMILAR_PREFIX_FORMAT = TEXT("_%u"); TChar buffer[SIMILAR_PREFIX_SIZE]; unsigned long counter = 2; do { _stprintf_s(buffer, SIMILAR_PREFIX_FORMAT, counter++); uniquePath = CreatePath(oldPath.GetDirectory(), oldPath.GetName(false) + TString(buffer) + oldPath.GetExtension()); } while (IsFileExists(uniquePath.c_str())); return uniquePath; }
// Ищет цифры в имени файла с конца. __int64 GetDigitInFileName(const TPath &path, TString & nameWithoutDigit, size_t & leadingZeros) { TString name = path.GetName(false); size_t length = name.length(); //Находим первый не числовой символ с конца bool canRename; size_t digitPos = length; for (ptrdiff_t i = length - 1; i >= 0; digitPos = i, i-- ) { if (!iswdigit(name[i])) //если не цифра выходим break; } if (digitPos <= length - 1) //если цифра найдена canRename = true; else canRename = false; __int64 result = -1; int numOfZero = 0; if (canRename) { TString forParsing = name.substr(digitPos, length - digitPos); result = _wtoi64(forParsing.c_str()); if (result == _I64_MAX) //слишком длинный { digitPos = 0; result = -1; } leadingZeros = forParsing.length() - LengthOfLong(result); } if (digitPos > 0 && digitPos < length) nameWithoutDigit = name.substr(0, digitPos); else nameWithoutDigit = TString(); return result; }