通过文件句柄获得文件路径
来源:互联网 发布:seo的工作一定要会编程 编辑:程序博客网 时间:2024/05/12 14:55
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,这个函数可以将驱动器的根路径转换为设备名,
然后进行循环比较,可得文件路径。
#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 = 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;}
- 通过文件句柄获得文件路径
- SDK通过文件句柄获取文件路径
- 通过文件句柄获取文件路径
- 通过文件路径获得文件大小
- 通过NSHomeDirectory获得文件路径
- 通过文件描述符获得文件路径
- 从文件句柄获得全路径 (二)
- 从打开的文件句柄获得文件的路径(三)
- 获得文件基本路径
- 获得文件路径
- Android获得文件路径
- java获得文件路径
- html 通过js获得文件路径(适用于ie)
- 从文件句柄到文件路径
- 文件描述符、文件句柄、文件路径的转换接口
- 获得class文件的路径
- dedecms 获得文件路径,文件名
- javascript获得当前文件路径
- C# WinForm程序退出的方法
- [Latex] PGF and Tikz 中如何定义一个新的颜色
- arm数据移动操作的解释,伪代码
- 直接使用代码建立Android视图元件
- 给IT新人的15个建议:苦逼程序员的辛酸反省与总结
- 通过文件句柄获得文件路径
- 自定义alertdialog---2
- PHP编程注意事项
- WordPress三链客:Broken Link Checker,Broken Link Checker,WP External links
- 算法之最长递增子序列,最长公共子序列
- android界面设计总结
- 第二周 项目五 玩转日期
- ARM状态寄存器
- 简单动态规划集(一)