Windows系統提供了一個名為GetMappedFileName的API函數,這個函數可以實現從mapping對象的句柄得到被映射 文件的路徑。但是路徑是以設備名的形式給出的,如類似於 “\Device\HarddiskVolume4\MyCode\C C++\test\test\zengxinxin.txt”,而這個文件在我自己電腦上的路徑是 “D:\MyCode\C C++\test\test\zengxinxin.txt”。所以我們要做的就是將“\Device\HarddiskVolume4”轉換為“D:”。 將設備名轉換為路徑名需要使用一個API函數------QueryDosDevice,這個函數可以將驅動器的根路徑轉換為設備名, 然後進行循環比較,可得文件路徑。 [cpp] #include <Windows.h> #include <stdio.h> #include <tchar.h> #include <cstring> #include <psapi.h> using namespace std; #pragma comment(lib, "psapi.lib") #define BUFSIZE 512 BOOL GetFileNameFromHandle(HANDLE hFile) { TCHAR pszFileName[MAX_PATH]; HANDLE hFileMap; PVOID pMem; //獲取文件大小 DWORD dwFileSizeHigh = 0; DWORD dwFileSizeLow = GetFileSize(hFile, &dwFileSizeHigh); if (dwFileSizeLow == 0 && dwFileSizeHigh == 0) { printf("不能map文件大小為0的文件.\n"); return FALSE; } //創建Mapping對象 hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1, NULL); if (!hFileMap) { printf("CreateFileMapping error: %d", GetLastError()); return FALSE; } pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1); if (!pMem) { printf("MapViewOfFile error: %d", GetLastError()); return FALSE; } //從Mapping對象獲得文件名 if (0 == GetMappedFileName(GetCurrentProcess(), pMem, pszFileName, //以設備名的形式獲得文件路徑,運行時設個斷點查看即可 MAX_PATH)) { printf("GetMappedFileName error: %d", GetLastError()); return FALSE; } TCHAR szTemp[MAX_PATH] = {0}; //獲取電腦上的所有驅動器,如"C:\" "D:\"等,連續放置的 if (0 == GetLogicalDriveStrings(BUFSIZE-1, szTemp)) { printf("GetLogicalDriveStrings error: %d", GetLastError()); return FALSE; } TCHAR szName[MAX_PATH]; TCHAR szDrive[3] = {0}; BOOL bFound = FALSE; //通過指針p的移動來順序訪問所有的驅動器目錄 PTCHAR p = szTemp; do { CopyMemory(szDrive, p, 2*sizeof(TCHAR)); //通過路徑查找設備名,如"C:" if (!QueryDosDevice(szDrive, szName, BUFSIZE)) { printf("QueryDosDrive error: %d", GetLastError()); return FALSE; } UINT uNameLen = lstrlen(szName); if (uNameLen < MAX_PATH) { //比較驅動器的設備名文件名與文件設備名是否匹配 bFound = strncmp(pszFileName, szName, uNameLen) == 0; if (bFound) { //如果匹配,說明已找到,構造路徑 TCHAR szTempFile[MAX_PATH]; wsprintf(szTempFile, TEXT("%s%s"), szDrive, pszFileName+uNameLen); lstrcpy(pszFileName, szTempFile); } } //這裡不理解的話可以去看看GetLogicalDriveStrings while (*p++); }while (!bFound && *p); UnmapViewOfFile(pMem); CloseHandle(hFileMap); printf("File Path is %s\n", pszFileName); return TRUE; } int main() { HANDLE hFile; HANDLE hFind; WIN32_FIND_DATA wfd; hFind = FindFirstFile("*.txt", &wfd); if (hFind == INVALID_HANDLE_VALUE) { printf("can not find a file"); return 1; } printf("find %s at current dir\n", wfd.cFileName); hFile = CreateFile(wfd.cFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("create file error, %d", GetLastError()); } else { GetFileNameFromHandle(hFile); } CloseHandle(hFile); system("pause"); return 0; }