Функция GetFullPathNameA (fileapi.h)
Извлекает полный путь и имя файла указанного файла.
Чтобы выполнить эту операцию как транзакцию, используйте функцию GetFullPathNameTransacted.
Дополнительные сведения о именах файлов и путей см. в имена файлов, пути и пространства имен.
Синтаксис
DWORD GetFullPathNameA(
[in] LPCSTR lpFileName,
[in] DWORD nBufferLength,
[out] LPSTR lpBuffer,
[out] LPSTR *lpFilePart
);
Параметры
[in] lpFileName
Имя файла.
Этот параметр может быть коротким (форма 8.3) или длинным именем файла. Эта строка также может быть общим именем или именем тома.
[in] nBufferLength
Размер буфера для получения строки, завершаемой значением NULL для диска и пути, в TCHARs.
[out] lpBuffer
Указатель на буфер, получающий строку, завершающую значение NULL, для диска и пути.
[out] lpFilePart
Указатель на буфер, который получает адрес (в lpBuffer) конечного компонента имени файла в пути.
Этот параметр может быть NULL.
Если lpBuffer ссылается на каталог, а не файл, lpFilePart получает ноль.
Возвращаемое значение
Если функция выполнена успешно, возвращаемое значение имеет длину в TCHARs, строки, скопированной в lpBuffer, не включая завершающий символ NULL.
Если буфер
Если функция завершается ошибкой по какой-либо другой причине, возвращаемое значение равно нулю. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.
Замечания
GetFullPathName объединяет имя текущего диска и каталога с указанным именем файла, чтобы определить полный путь и имя файла указанного файла. Он также вычисляет адрес части имени файла полного пути и имени файла.
Эта функция не проверяет, является ли полученный путь и имя файла допустимыми или что они видят существующий файл на связанном томе.
Обратите внимание, что параметр lpFilePart не требует пространства буфера строки, но достаточно только для одного адреса. Это связано с тем, что он просто возвращает адрес в буфере, который уже существует для lpBuffer.
Имена общих ресурсов и томов являются допустимыми входами для lpFileName. Например, следующий список удостоверяет возвращаемый путь и имена файлов, если тест-2 является удаленным компьютером и U: это сетевой сопоставленный диск, текущий каталог которого является корнем тома:
- Если указать "\\test-2\q$\lh", возвращаемый путь будет "\\test-2\q$\lh"
- Если указать "\\?\UNC\test-2\q$\lh" возвращается путь "\\?\UNC\test-2\q$\lh".
- Если указать "U:", возвращенный путь является текущим каталогом на диске "U:\"
Если возвращаемое значение больше или равно значению, указанному в nBufferLength, можно снова вызвать функцию с буфером, достаточно большим для хранения пути. Пример этого дела в дополнение к использованию буфера нулевой длины для динамического выделения см. в разделе "Пример кода".
Относительные пути, передаваемые функции getFullPathName , интерпретируются как относительные к текущему каталогу процесса. Текущее состояние каталога, написанное функцией SetCurrentDirectory , глобальной для процесса и может быть изменено любым потоком в любое время. Приложения должны учитывать, что последовательные вызовы функции GetFullPathName с относительным путем могут привести к разным результатам, если текущий каталог изменяется между двумя вызовами.
Чтобы избежать проблем, вызванных несогласованными результатами, многопоточные приложения и код общей библиотеки должны избегать использования относительных путей. Если получен относительный путь, он должен использоваться ровно один раз, передав относительный путь непосредственно в функцию, например CreateFile, или преобразовав его в абсолютный путь и используя абсолютный путь от этой точки вперед.
В Windows 8 и Windows Server 2012 эта функция поддерживается следующими технологиями.
Технологии | Поддержанный |
---|---|
Протокол SMB 3.0 | Да |
Отработка отказа SMB 3.0 (TFO) | Да |
SMB 3.0 с масштабируемыми общими папками (SO) | Да |
Файловая система общего тома кластера (CSVFS) | Да |
Отказоустойчивая файловая система (ReFS) | Да |
Примеры
В следующем примере C++ показано базовое использование GetFullPathName, GetLongPathNameи GetShortPathName. Другой пример использования динамического выделения см. в разделе GetShortPathName.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define BUFSIZE 4096
#define LONG_DIR_NAME TEXT("c:\\longdirectoryname")
void _tmain(int argc, TCHAR *argv[])
{
DWORD retval=0;
BOOL success;
TCHAR buffer[BUFSIZE]=TEXT("");
TCHAR buf[BUFSIZE]=TEXT("");
TCHAR** lppPart={NULL};
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [file]\n"), argv[0]);
return;
}
// Retrieve the full path name for a file.
// The file does not need to exist.
retval = GetFullPathName(argv[1],
BUFSIZE,
buffer,
lppPart);
if (retval == 0)
{
// Handle an error condition.
printf ("GetFullPathName failed (%d)\n", GetLastError());
return;
}
else
{
_tprintf(TEXT("The full path name is: %s\n"), buffer);
if (lppPart != NULL && *lppPart != 0)
{
_tprintf(TEXT("The final component in the path name is: %s\n"), *lppPart);
}
}
// Create a long directory name for use with the next two examples.
success = CreateDirectory(LONG_DIR_NAME,
NULL);
if (!success)
{
// Handle an error condition.
printf ("CreateDirectory failed (%d)\n", GetLastError());
return;
}
// Retrieve the short path name.
retval = GetShortPathName(LONG_DIR_NAME,
buf,
BUFSIZE);
if (retval == 0)
{
// Handle an error condition.
printf ("GetShortPathName failed (%d)\n", GetLastError());
return;
}
else _tprintf(TEXT("The short name for %s is %s\n"),
LONG_DIR_NAME, buf);
// Retrieve the long path name.
retval = GetLongPathName(buf,
buffer,
BUFSIZE);
if (retval == 0)
{
// Handle an error condition.
printf ("GetLongPathName failed (%d)\n", GetLastError());
return;
}
else _tprintf(TEXT("The long name for %s is %s\n"), buf, buffer);
// Clean up the directory.
success = RemoveDirectory(LONG_DIR_NAME);
if (!success)
{
// Handle an error condition.
printf ("RemoveDirectory failed (%d)\n", GetLastError());
return;
}
}
Заметка
Заголовок fileapi.h определяет GetFullPathName как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [классические приложения | Приложения UWP] |
минимальный поддерживаемый сервер | Windows Server 2003 [классические приложения | Приложения UWP] |
целевая платформа | Виндоус |
заголовка | fileapi.h (включая Windows.h) |
библиотеки |
Kernel32.lib |
DLL | Kernel32.dll |