Функция GetFinalPathNameByHandleA (fileapi.h)
Извлекает окончательный путь к указанному файлу.
Дополнительные сведения об именах файлов и путей см. в разделе Именование файла.
Синтаксис
DWORD GetFinalPathNameByHandleA(
[in] HANDLE hFile,
[out] LPSTR lpszFilePath,
[in] DWORD cchFilePath,
[in] DWORD dwFlags
);
Параметры
[in] hFile
Дескриптор файла или каталога.
[out] lpszFilePath
Указатель на буфер, который получает путь к hFile.
[in] cchFilePath
Размер lpszFilePath в TCHARs. Это значение должно содержать символ завершения NULL .
[in] dwFlags
Тип возвращаемого результата. Этот параметр может принимать одно из указанных ниже значений.
Значение | Значение |
---|---|
|
Возвращает имя нормализованного диска. Это значение по умолчанию. |
|
Возвращает имя открытого файла (не нормализованное). |
Этот параметр также может включать одно из следующих значений.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение — это длина строки, полученной lpszFilePath, в TCHARs. Это значение не включает размер завершающего символа NULL.
Windows Server 2008 и Windows Vista: Для версии ANSI этой функции , GetFinalPathNameByHandleA, возвращаемое значение включает размер завершающего символа NULL.
Если функция завершается сбоем из-за того, что lpszFilePath слишком мал для хранения строки и завершающего символа NULL, возвращаемое значение является требуемым размером буфера в TCHAR. Это значение включает размер завершающего символа NULL.
Если функция завершается сбоем по какой-либо другой причине, возвращаемое значение равно нулю. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Код возврата | Описание |
---|---|
|
Может быть возвращено, если вы ищете букву диска и ее не существует. Например, дескриптор был открыт на диске, который в настоящее время не подключен, или если создать том и не назначить ему букву диска. Если в томе нет буквы диска, можно использовать путь GUID тома для его идентификации.
Это возвращаемое значение также может быть возвращено при поиске пути GUID тома в сетевой папке. Пути GUID тома не создаются для общих сетевых ресурсов. |
|
Недостаточно памяти для завершения операции. |
|
Для dwFlags указаны недопустимые флаги. |
Комментарии
Протокол SMB не поддерживает запросы для нормализованных путей. Следовательно, при вызове этой функции, передавая дескриптор файла, открытого с помощью SMB, с флагом FILE_NAME_NORMALIZED функция разделяет путь на компоненты и пытается запросить нормализованное имя каждого из этих компонентов по очереди. Если у пользователя нет разрешения на доступ к какому-либо из этих компонентов, вызов функции завершается сбоем с ERROR_ACCESS_DENIED.
Последний путь — это путь, который возвращается при полном разрешении пути. Например, для символьной ссылки "C:\tmp\mydir", указывающей на "D:\yourdir", конечным путем будет "D:\yourdir".
Строка, возвращаемая этой функцией, использует синтаксис "\\?\". Дополнительные сведения см. в разделе CreateFile.
В Windows 8 и Windows Server 2012 эта функция поддерживается следующими технологиями.
Технология | Поддерживается |
---|---|
Протокол SMB 3.0 | Да |
SMB 3.0 Transparent Failover (TFO) | Да |
SMB 3.0 с масштабируемыми общими папками (SO) | Да |
Файловая система общего тома кластера (CSVFS) | Да |
Восстанавливаемая файловая система (ReFS) | Да |
Примеры
В следующем примере показано использование функции GetFinalPathNameByHandle .
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define BUFSIZE MAX_PATH
void __cdecl _tmain(int argc, TCHAR *argv[])
{
TCHAR Path[BUFSIZE];
HANDLE hFile;
DWORD dwRet;
printf("\n");
if( argc != 2 )
{
printf("ERROR:\tIncorrect number of arguments\n\n");
printf("%s <file_name>\n", argv[0]);
return;
}
hFile = CreateFile(argv[1], // file to open
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // default security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if( hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d\n)", GetLastError());
return;
}
dwRet = GetFinalPathNameByHandle( hFile, Path, BUFSIZE, VOLUME_NAME_NT );
if(dwRet < BUFSIZE)
{
_tprintf(TEXT("\nThe final path is: %s\n"), Path);
}
else printf("\nThe required buffer size is %d.\n", dwRet);
CloseHandle(hFile);
}
Примечание
Заголовок fileapi.h определяет GetFinalPathNameByHandle в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Использование псевдонима, не зависящий от кодирования, с кодом, который не является нейтральным для кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или времени выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | fileapi.h (включая Windows.h) |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |