從檔案控制代碼得到檔案路徑的函式
主要思路:
1. 呼叫 getfileinformationbyhandle 函式得到指定檔案控制代碼的相應檔案資訊, 再呼叫 getlogicaldrivestrings 函式得到所有驅動器碟符, 用 getvolumeinformation 函式遍歷每個碟符, 取得碟符的卷序列號, 然後與前一步得到的檔案資訊比較, 找到該檔案的碟符.
2. 呼叫 zwqueryinformationfile 函式, 得到檔案控制代碼的檔案路徑, 這個路徑是沒有碟符的, 將步驟1得到的碟符加在這個路徑的前邊, 就得到了整個路徑了. 以下是實現**.
handle2path.h
#pragma once
#ifndef _countof
#define
_countof(array) (sizeof(array)/sizeof((array)[0]))
#endif
extern_c bool getfilepathfromhandlew(handle hfile, lpwstr lpszpath, uint cchmax);
extern_c bool getfilepathfromhandlea(handle hfile, lpstr lpszpath, uint cchmax);
#ifdef unicode
#define
getfilepathfromhandle getfilepathfromhandlew
#else
#define
getfilepathfromhandle getfilepathfromhandlea
#endif
handle2path.c
#include
<
windows.h
>
#include
<
tchar.h
>
#include
<
shlwapi.h
>
#pragma comment(lib,
"shlwapi")
#include
"handle2path.h
"extern_c bool getvolumenamebyhandle(handle hfile, lpwstr szvolumename, uint cchmax)
;wchar
*piter
=szbuf;
inti =0
;by_handle_file_information stfileinfo =;
doif(0
==getlogicaldrivestringsw(_countof(szbuf), szbuf))
for(; piter; piter+=4
)}}}
while
(false);
return
bresult;
}typedef
struct
_io_status_block io_status_block,
*pio_status_block;
typedef
struct
_file_name_information file_name_information;
__declspec(dllimport) long __stdcall zwqueryinformationfile (
in handle filehandle,
out pio_status_block iostatusblock,
out pvoid fileinformation,
in ulong fileinformationlength,
in ulong fileinformationclass
);typedef long (__stdcall
*pfn_zwqueryinformationfile) (
in handle filehandle,
out pio_status_block iostatusblock,
out pvoid fileinformation,
in ulong fileinformationlength,
in ulong fileinformationclass
);extern_c bool getfilepathfromhandlew(handle hfile, lpwstr lpszpath, uint cchmax)
;io_status_block isb =;
file_name_information fni =;
handle hntdll
=null;
pfn_zwqueryinformationfile pfn_zwqueryinformationfile
=null;
dohntdll
=getmodulehandle(_t(
"ntdll.dll
"));
if(null
==hntdll)
pfn_zwqueryinformationfile
=(pfn_zwqueryinformationfile)
getprocaddress(hntdll,
"zwqueryinformationfile");
if(null
==pfn_zwqueryinformationfile)
//9 == filenameinformationif(
0!=pfn_zwqueryinformationfile(hfile,
&isb,
&fni,
sizeof
(fni),
9))
if(false
==getvolumenamebyhandle(hfile, szvalue, _countof(szvalue)))
while
(false);
return
bresult;
}extern_c bool getfilepathfromhandlea(handle hfile, lpstr lpszpath, uint cchmax);do
if(false
==getfilepathfromhandlew(hfile, sztmep, _countof(sztmep))) if(
0==widechartomultibyte(cp_acp, 0,
sztmep, lstrlenw(sztmep),
lpszpath, cchmax, null, null))
bresult
=true;
} while
(false);
return
bresult;
}
如何從視窗控制代碼得到與視窗關聯的檔案路徑 檔名
在windows95 98上,使用getwindowmodulefilename可以很方便地實現這個功能。uint getwindowmodulefilename hwnd hwnd,視窗控制代碼 lptstr lpszfilename,檔案路徑 uint cchfilenamemax 但是到了wi...
從檔案控制代碼獲得全路徑 (二)
從檔案控制代碼獲得全路徑這個問題,似乎是個 老大難 問題。很久以前我就在水木清華見到過。最近又不斷有人提到。其實問題並不難,只是解決辦法有點繞,不是呼叫乙個api就能解決的。問題的關鍵在於,形如 x 的dos裝置名都是符號鏈結 symbliclink 而檔案開啟後檔案物件中儲存的是邏輯卷裝置名 如 ...
根據檔案路徑得到檔案其它屬性
利用findfirstfile 可以通過路徑得到檔案的很多屬性。關於檔案的全部屬性資訊,總計有以下以下9 種 檔案的標題名 檔案的屬性 唯讀 存檔,隱藏等 檔案的建立時間 檔案的最後訪問時間 檔案的最後修改時間 檔案大小的高位雙字 檔案大小的低位雙字 保留 保留。其中使用的結構體如下 typedef...