通过文件句柄取得到文件名(二)

从文件句柄获得文件名方法二, 这个是用GetMappedFileName()函数,局限是只能取得可以文件映射(File Mapping)的文件句柄。

参考 MSDN Obtaining a File Name From a File Handle.

前一篇通过文件句柄取得到文件名

 

// reference to "Obtaining a File Name From a File Handle" // http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx #include <Windows.h> #include <Psapi.h> #include <string.h> #pragma comment(lib, "Psapi.lib") LPWSTR GetFileNameFromHandleW2(HANDLE hFile, LPWSTR lpFilePath) { lpFilePath[0] = 0x00; BOOL bSuccess = FALSE; // Get the name of the memory-mapped file. WCHAR szPathInfo[MAX_PATH*2]; DWORD dwFileSizeHi = 0; DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); if (!dwFileSizeLo && !dwFileSizeHi) { return 0x00; } HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSizeLo, NULL); if (hFileMap) { LPVOID pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1); if (pMem) { bSuccess = GetMappedFileNameW(GetCurrentProcess(), pMem, szPathInfo, MAX_PATH*2-1); UnmapViewOfFile(pMem); } CloseHandle(hFileMap); } if (bSuccess == FALSE) { return 0x00; } WCHAR szDrive [MAX_PATH]; WCHAR *lpDrive = szDrive; int iPathLen; if (GetLogicalDriveStringsW(MAX_PATH, szDrive) >= MAX_PATH) { return 0x00; } while ((iPathLen = lstrlenW(lpDrive)) != 0) { WCHAR szDevName[MAX_PATH]; lpDrive[iPathLen - 1] = 0x00; int iDevLen = (int)QueryDosDeviceW(lpDrive, szDevName, MAX_PATH); if (iDevLen && iDevLen < MAX_PATH){ iDevLen = lstrlenW(szDevName); if (!wcsnicmp(szPathInfo, szDevName, iDevLen)) { lstrcpyW(lpFilePath, lpDrive); lstrcatW(lpFilePath, szPathInfo + iDevLen); break; } } lpDrive += iPathLen + 1; } return lpFilePath; }

你可能感兴趣的:(File,null,Path,reference)