從檔案控制代碼得到檔案路徑的函式 (一)

2021-06-03 12:49:37 字數 3430 閱讀 3255

從檔案控制代碼得到檔案路徑的函式

主要思路:

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...