通过文件句柄获得文件路径
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 512BOOL 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);}}//这里不理解的话可以去看看GetLogicalDriveStringswhile (*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 = Find补充:软件开发 , C++ ,
上一个:XMU1456 水体
下一个:HDUOJ 2086推导
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊