FSF.ConvertPath

Programming Far Manager plugins

ConvertPath

Функция FSF.ConvertPath преобразует относительное имя файлового объекта в полное (относительно FSF.GetCurrentDirectory() - в большинстве случаев это соответствует текущему каталогу активной панели).

Замечание для ConvertPath Внимание!

  • Не используйте для этих целей функцию 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"

Замечания

  1. Параметры 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());
Смотрите также: