Я анализирую пути с помощью функции библиотеки _wsplitpath_s()
использовать с функциями Win32 API.
В соответствии с этот документ MSDN, длинные пути (длиннее, чем MAX_PATH
символы) должны начинаться с префикса \\?\
, Однако, когда я добавляю его к строке полного пути, _wsplitpath_s()
не могу разобрать это правильно.
Пример кода:
std::wstring FullPath = L"\\\\?\\K:\\A Directory\\Another Directory\\File Name.After Period.extension";
std::wstring Drive, Directory, FileName, Extension;
Drive.resize (FullPath.size());
Directory.resize (FullPath.size());
FileName.resize (FullPath.size());
Extension.resize (FullPath.size());
errno_t Error = _wsplitpath_s( FullPath.c_str(),
&Drive[0],
Drive.size(),
&Directory[0],
Directory.size(),
&FileName[0],
FileName.size(),
&Extension[0],
Extension.size());
std::wcout << L"Full path to be splitted : " << FullPath.c_str() << std::endl;
std::wcout << L"Drive : " << Drive.c_str() << std::endl;
std::wcout << L"Directory : " << Directory.c_str() << std::endl;
std::wcout << L"File name : " << FileName.c_str() << std::endl;
std::wcout << L"Extension : " << Extension.c_str() << std::endl;
std::wcout << L"Error value returned : " << Error << std::endl;
std::wcout << L"Did error occur? : " << (Error == EINVAL) << std::endl;
std::wcout << L"Value of 'EINVAL' : " << EINVAL << std::endl;
Фактический вывод кода выше:
Full path to be splitted : \\?\K:\A Directory\Another Directory\File Name.After Period.extension
Drive :
Directory : \\?\K:\A Directory\Another Directory\
File name : File Name.After Period
Extension : .extension
Error value returned : 0
Did error occur? : 0
Value of 'EINVAL' : 22
Как это работает с короткими путями:
Full path to be splitted : K:\A Directory\Another Directory\File Name.After Period.extension
Drive : K:
Directory : \A Directory\Another Directory\
File name : File Name.After Period
Extension : .extension
Ожидаемое поведение для длинных путей:
Full path to be splitted : \\?\K:\A Directory\Another Directory\File Name.After Period.extension
Drive : K:
Directory : \A Directory\Another Directory\
File name : File Name.After Period
Extension : .extension
Есть ли альтернатива _wsplitpath_s()
который поддерживает соглашение об именах длинных путей?
Алгоритм STL, функция Win32 API или функция библиотеки C принимаются в указанном порядке.
Задача ещё не решена.
Других решений пока нет …