| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- // ExtractingFilePath.cpp
- #include "StdAfx.h"
- #include "ExtractingFilePath.h"
- static UString ReplaceIncorrectChars(const UString &s)
- {
- #ifdef _WIN32
- UString res;
- for (int i = 0; i < s.Length(); i++)
- {
- wchar_t c = s[i];
- if (c < 0x20 || c == '*' || c == '?' || c == '<' || c == '>' || c == '|' || c == ':' || c == '"')
- c = '_';
- res += c;
- }
- return res;
- #else
- return s;
- #endif
- }
- #ifdef _WIN32
- static const wchar_t *g_ReservedNames[] =
- {
- L"CON", L"PRN", L"AUX", L"NUL"
- };
- static bool CheckTail(const UString &name, int len)
- {
- int dotPos = name.Find(L'.');
- if (dotPos < 0)
- dotPos = name.Length();
- UString s = name.Left(dotPos);
- s.TrimRight();
- return (s.Length() != len);
- }
- static bool CheckNameNum(const UString &name, const wchar_t *reservedName)
- {
- int len = MyStringLen(reservedName);
- if (name.Length() <= len)
- return true;
- if (name.Left(len).CompareNoCase(reservedName) != 0)
- return true;
- wchar_t c = name[len];
- if (c < L'0' || c > L'9')
- return true;
- return CheckTail(name, len + 1);
- }
- static bool IsSupportedName(const UString &name)
- {
- for (int i = 0; i < sizeof(g_ReservedNames) / sizeof(g_ReservedNames[0]); i++)
- {
- const wchar_t *reservedName = g_ReservedNames[i];
- int len = MyStringLen(reservedName);
- if (name.Length() < len)
- continue;
- if (name.Left(len).CompareNoCase(reservedName) != 0)
- continue;
- if (!CheckTail(name, len))
- return false;
- }
- if (!CheckNameNum(name, L"COM"))
- return false;
- return CheckNameNum(name, L"LPT");
- }
- #endif
- static UString GetCorrectFileName(const UString &path)
- {
- if (path == L".." || path == L".")
- return UString();
- return ReplaceIncorrectChars(path);
- }
- void MakeCorrectPath(UStringVector &pathParts)
- {
- for (int i = 0; i < pathParts.Size();)
- {
- UString &s = pathParts[i];
- s = GetCorrectFileName(s);
- if (s.IsEmpty())
- pathParts.Delete(i);
- else
- {
- #ifdef _WIN32
- if (!IsSupportedName(s))
- s = (UString)L"_" + s;
- #endif
- i++;
- }
- }
- }
|