# 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"`

### Замечания

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());

Смотрите также: