Пример ниже получает имя файла из его дескриптора, используя объект "проецируемый файл". Используются функции CreateFileMapping и MapViewOfFile, чтобы создать отображение. Затем, используется функция GetMappedFileName, чтобы получить имя файла. Для удаленных файлов, печатается путь к устройству, полученный от этой функции. Для локальных файлов, преобразуется путь, чтобы использовать имя диска и печатает этот путь. Чтобы проверить этот код, создайте функцию main, которая открывает файл, используя CreateFile и передает полученный дескриптор GetFileNameFromHandle.
При использовании этого типового кода, убедитесь, что добавили стандартное выявление ошибок для всех функций.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>
#define BUFSIZE 512
BOOL GetFileNameFromHandle(HANDLE hFile)
{
BOOL bSuccess = FALSE;
TCHAR pszFilename[MAX_PATH+1];
BOOL GetFilenameFromHandle(HANDLE hFile)
{
BOOL bSuccess = FALSE;
TCHAR pszFilename[MAX_PATH+1];
HANDLE hFileMap;
// Получим размер файла.
DWORD dwFileSizeHi = 0;
DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);
if( dwFileSizeLo == 0 && dwFileSizeHi == 0 )
{
printf("Не может отобразить файл нулевой длины.\n");
return FALSE;
}
// Создадим объект "проецируемый файл".
hFileMap = CreateFileMapping(hFile,
NULL,
PAGE_READONLY,
0,
1,
NULL);
if (hFileMap)
{
// Создадим проецируемый файл, чтобы получить имя файла.
void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
if (pMem)
{
if (GetMappedFileName (GetCurrentProcess(),
pMem,
pszFilename,
MAX_PATH))
{
// Преобразуем путь к имени устройства
// в имя диска.
TCHAR szTemp[BUFSIZE];
szTemp[0] ='\0' ;
if (GetLogicalDriveStrings(BUFSIZE-1, szTemp))
{
TCHAR szName[MAX_PATH];
TCHAR szDrive[3] = TEXT(" :");
BOOL bFound = FALSE;
TCHAR* p = szTemp;
do {
// Копируем имя диска в строку шаблона,
// удалив обратный слэша (/).
*szDrive = *p;
// Найдем имя каждого устройства.
if (QueryDosDevice(szDrive, szName, BUFSIZE))
{
UINT uNameLen = _tcslen(szName);
// Если оно больше чем длина имени файла, оно не соответствует соглашение об именах.
if (uNameLen < MAX_PATH)
{
bFound = _tcsnicmp(pszFilename, szName,
uNameLen)== 0;
if (bFound)
{
// Перестроим pszFilename используя szTemp как временную память,
// и заменим путь устройства на наш путь в синтаксисе DOS.
TCHAR szTempFile[MAX_PATH];
_stprintf(szTempFile,
TEXT("%s%s"),
szDrive,
pszFilename+uNameLen);
_tcsncopy(pszFilename, szTempFile, MAX_PATH);
}
}
}
// Перейдем к следующему символу ПУСТО (NULL).
while (*p++);
} while (!bFound && *p); // конец строки
}
}
bSuccess = TRUE;
UnmapViewOfFile(pMem);
}
CloseHandle(hFileMap);
}
printf("Имя файла %s\n", pszFilename);
return(bSuccess);
}
|