[PowerRename] Using File Attributes Update (#5250)

* Use only fff for milliseconds

* Refactor

* Handle double $ signs.
Move isFileAttributes check to Helpers.
Move File Attributes to perform before regex operation

* Fix typo

* Format date/time test

* Disable problematic features. Add comments

* Fix month/day names

* Add tests

* Add line between tests

* Add local month/day names support

* Make sure month/date names are capitalized

* Fix formatting
This commit is contained in:
Mehmet Murat Akburak
2020-08-20 02:53:09 +03:00
committed by GitHub
parent 69cb20e1cd
commit 64106cba82
4 changed files with 176 additions and 77 deletions

View File

@@ -764,11 +764,28 @@ DWORD WINAPI CPowerRenameManager::s_regexWorkerThread(_In_ void* pv)
StringCchCopy(sourceName, ARRAYSIZE(sourceName), originalName);
}
wchar_t newReplaceTerm[MAX_PATH] = { 0 };
PWSTR replaceTerm = nullptr;
SYSTEMTIME LocalTime;
if (SUCCEEDED(spRenameRegEx->get_replaceTerm(&replaceTerm)) && isFileAttributesUsed(replaceTerm))
{
if (SUCCEEDED(spItem->get_date(&LocalTime)))
{
if (SUCCEEDED(GetDatedFileName(newReplaceTerm, ARRAYSIZE(newReplaceTerm), replaceTerm, LocalTime)))
{
spRenameRegEx->put_replaceTerm(newReplaceTerm);
}
}
}
PWSTR newName = nullptr;
// Failure here means we didn't match anything or had nothing to match
// Call put_newName with null in that case to reset it
spRenameRegEx->Replace(sourceName, &newName);
spRenameRegEx->put_replaceTerm(replaceTerm);
wchar_t resultName[MAX_PATH] = { 0 };
PWSTR newNameToUse = nullptr;
@@ -812,35 +829,6 @@ DWORD WINAPI CPowerRenameManager::s_regexWorkerThread(_In_ void* pv)
{
newNameToUse = trimmedName;
}
bool isDateAttributeUsed = false;
wchar_t datedName[MAX_PATH] = { 0 };
std::wstring patterns[] = { L"$YYYY", L"$SSS", L"$MMM", L"$mmm", L"$FFF", L"$fff",
L"$MM", L"$DD", L"$hh", L"$mm", L"$ss" };
size_t patternsLength = ARRAYSIZE(patterns);
SYSTEMTIME LocalTime;
if (newNameToUse != nullptr)
{
for (size_t i = 0; !isDateAttributeUsed && i < patternsLength; i++)
{
std::wstring source(newNameToUse);
if (source.find(patterns[i]) != std::string::npos)
{
isDateAttributeUsed = true;
}
}
if (isDateAttributeUsed)
{
if (SUCCEEDED(spItem->get_date(&LocalTime)))
{
if (SUCCEEDED(GetDatedFileName(datedName, ARRAYSIZE(datedName), newNameToUse, LocalTime)))
{
newNameToUse = datedName;
}
}
}
}
wchar_t transformedName[MAX_PATH] = { 0 };
if (newNameToUse != nullptr && (flags & Uppercase || flags & Lowercase || flags & Titlecase))
@@ -879,6 +867,7 @@ DWORD WINAPI CPowerRenameManager::s_regexWorkerThread(_In_ void* pv)
}
CoTaskMemFree(newName);
CoTaskMemFree(replaceTerm);
CoTaskMemFree(currentNewName);
CoTaskMemFree(originalName);
}