ConvertPath
Функция
FSF.ConvertPath
преобразует относительное имя файлового объекта в полное (относительно FSF.GetCurrentDirectory() - в большинстве случаев это соответствует текущему каталогу активной панели).
Внимание!
- Не используйте для этих целей функцию
GetFullPathName
из Windows API. - Не передавайте относительные имена файлов в любые функции Windows API, все относительные пути должны быть преобразованы в полные.
- При передаче имён в функции Windows API используйте префикс "\\?\", чтобы избежать проблемы с длинными и нестандартными именами файлов.
size_t WINAPI ConvertPath( enum CONVERTPATHMODES Mode, const wchar_t *Src, wchar_t *Dest, size_t DestSize );
Параметры
Mode
Указывает на необходимое действие. Может быть следующим (перечисление CONVERTPATHMODES):
Действие | Описание |
---|---|
CPM_FULL | преобразует относительное имя файлового объекта в полное |
CPM_REAL | преобразует относительное имя файлового объекта в полное, с учётом символических ссылок. |
CPM_NATIVE | преобразует относительное имя файлового объекта в полное, предваряя путь префиксами "\\?\" (для локальных объектов) или "\\?\UNC\" (для сетевых объектов);это преобразование имеет смысл применять для избежания проблем с длинными и нестандартными именами файлов (подробности) |
Src
Указатель на источник данных - полное или относительное имя файла/каталога.
Dest
Укзатель на строку назначения, сюда будет помещён полный путь. Установите
Dest = NULL
для того, чтобы узнать необходимый размер буфера в символах.DestSize
Максимальное количество символов, которое можно поместить в
Dest
, с заключительным нулём.Возвращаемое значение
Необходимый размер буфера
Dest
в символах.
Особенности Mode = CPM_REAL
:
- Для монтированных дисков, которые не имеют буквы диска, функция поместит в
Dest
строку, подобную этой:"\\?\Volume{273872e0-5e49-11d5-b614-0080ad70bb9b}\Foo.bar"
- Если, например, каталог
"D:\Foo\Bar"
является симлинком для реально существующего"C:\work\Doc"
, то функция для файла"D:\Foo\Bar\1092\readme.txt"
вернёт"C:\work\Doc\1092\readme.txt"
Замечания
- Параметры
Src
иDest
могут ссылаться на одну и ту же строку.
Пример
Неправильно:
GetFileAttributes(L"..\\some_file");
Правильно:
std::vector<wchar_t> Buffer(MAX_PATH); for (;;) { const auto ActualSize = FSF.ConvertPath(CPM_FULL, L"..\\some_file", Buffer.data(), Buffer.size()); if (ActualSize <= Buffer.size()) break; Buffer.resize(ActualSize); } GetFileAttributes(Buffer.data());
Смотрите также: