程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 通過文件句柄獲得文件路徑

通過文件句柄獲得文件路徑

編輯:C++入門知識

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;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved