从文件句柄获得全路径 (二)
来源:互联网 发布:淘宝店合作合同 编辑:程序博客网 时间:2024/05/23 16:53
从文件句柄获得全路径这个问题,似乎是个“老大难”问题。
很久以前我就在水木清华见到过。最近又不断有人提到。
其实问题并不难,只是解决办法有点绕,不是调用一个API就能解决的。
问题的关键在于,形如”X:”的Dos设备名都是符号链接(SymblicLink),而文件打开后文件对象中保存的是逻辑卷设备名(如”\Device\HarddiskVolumeX”)。前者可以转换成后者,而后者却不能简单地转换成前者。以至于从句柄得到的路径总是“缺少”盘符这一部分。实际上,把所有的”X:”都变成设备名去匹配路径就可以了。
下面是演示代码,很简单,所以就不加注释啦 ^_^
- #include <windows.h>
- #include <ntsecapi.h>
- #pragma comment(lib,"ntdll.lib") // Copy From DDK
- NTSYSAPI
- NTSTATUS
- NTAPI
- ZwQueryObject(
- IN HANDLEObjectHandle,
- IN ULONGObjectInformationClass,
- OUT PVOIDObjectInformation,
- IN ULONGObjectInformationLength,
- OUT PULONGReturnLength OPTIONAL
- );
- BOOL GetPathByHandle(HANDLEhFile, LPWSTRlpBuf, DWORDnBuf)
- {
- ULONG m,n;
- WCHAR lpPath[MAX_PATH+4];
- WCHAR lpDrive[MAX_PATH];
- WCHAR lpDevName[MAX_PATH];
- if (ZwQueryObject(hFile,1, lpPath,MAX_PATH+4, &m) >=0 &&
- (m =GetLogicalDriveStringsW(MAX_PATH,lpDrive)) &&m < MAX_PATH)
- {
- WCHAR *p =lpDrive;
- while (m =wcslen(p))
- {
- p[m-1] = L'\0';
- n =QueryDosDeviceW(p,lpDevName, MAX_PATH);
- if (n &&n < MAX_PATH)
- {
- n =wcslen(lpDevName);
- if (!wcsnicmp(lpPath+4,lpDevName, n))
- {
- wcsncpy(lpBuf,p, nBuf);
- if (nBuf >2)wcsncpy(lpBuf+2,lpPath+4+n,nBuf-2);
- return TRUE;
- }
- }
- p +=m + 1;
- }
- }
- return FALSE;
- }
- void main()
- {
- WCHAR buf[MAX_PATH];
- HANDLE hFile =createFile("C:\\boot.ini",0, 0,0, OPEN_EXISTING,0, 0);
- if (hFile !=INVALID_HANDLE_VALUE)
- {
- GetPathByHandle(hFile,buf, MAX_PATH);
- printf("%ws\n",buf);
- CloseHandle(hFile);
- }
- else
- {
- printf("createFile Failed: %d\n",GetLastError());
- }
- }
- 从文件句柄获得全路径 (二)
- 从打开的文件句柄获得文件的路径(三)
- 通过文件句柄获得文件路径
- 从文件句柄得到文件路径的函数 (一)
- 从文件句柄到文件路径
- GoogleDrive----如何获得文件的全路径
- 文件上传,获得全路径名
- 经典win32代码之从文件句柄获得文件名
- [VC]“打开文件”对话框获得文件全路径
- VB如何从文件路径名中获得文件名?
- java获得文件全路径中关于路径分隔符的使用
- VC从文件全路径中获取文件名和扩展名方法(CString)
- VC从文件全路径中获取文件名和扩展名方法(CString)
- VC从文件全路径中获取文件名和扩展名方法(CString)
- 获得文件基本路径
- 获得文件路径
- Android获得文件路径
- java获得文件路径
- 宋词高频词汇和数字代码
- 中科院ICTCLAS中文分词工具C++源码
- 从系统响应的观点看西瓜挑选
- 从文件句柄得到文件路径的函数 (一)
- 对象池创建java对象反射机制
- 从文件句柄获得全路径 (二)
- 关于TOMCAT主目录与虚拟目录的配置介绍
- 三星 Bada 和 Tizen 牵手看来是早晚的事情
- Testing the CATCHER
- python的staticmethod和classmethod
- linux 网络编程
- 容易造成core的原因
- 从HTTP GET和POST的区别说起
- C/C++比Java性能好的原因