Пример ниже получает имя файла из его дескриптора, используя объект "проецируемый файл". Используются функции 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); } |