usn不太好懂,原本的想法是先建立乙個所有檔案的資料庫,然後根據usn日誌的記錄來更新資料庫,達到快速搜尋檔案的目標。
在使用deviceiocontrol
(volume_handle,fsctl_enum_usn_data,
&med,
sizeof
(med)
,buffer,
sizeof
(buffer)
,&bytes_returned,
null
)時,一直認為是列舉usn日誌中的所有記錄,其實好像是列舉卷上所有的檔案。主檔案表mft目錄條目中會記錄檔案的最新usn更新號,enum_mft_data結構體提供了乙個範圍,然後遍歷mft表時會把usn號處於限制範圍內的目錄條目讀出,當把範圍定為0
~最新的usn號時,那麼所有檔案就被讀出了。
獲取路徑時試過乙個核心api,咱也不太懂,也沒搞出來,但是檔名可以拿到,所以選擇先掃瞄一遍mft,建立frn和(檔名,pfrn)的對映,若搜尋的檔案存在,則可以得到其frn,然後得到名字,再根據pfrn得到上級目錄名字,frn=pfrn,層層迭代直到碟符,(要得到盤的frn),拼起來就成。
#ifndef usn_h_
#define usn_h_
#include
#include
#include
#include
#include
using namespace std;
typedef
struct
journal_info;
typedef
struct
file_node;
typedef
struct
volume_info;
typedef map path_map;
bool get_handle
(lpcstr volume_name,handle &volume_handle)
bool get_journal_info
(handle &volume_handle,journal_info &journal_info)
else
}bool delete_usn_journal
(handle &volume_handle,journal_info journal_info)
//刪除日誌檔案,並不關閉日誌
void
enum_mft
(handle volume_handle,journal_info journal_info,path_map &path_map)
//列舉卷上所有檔案
;
bytes_returned-
=usn_record->recordlength;
usn_record=
(pusn_record)
((pchar)usn_record+usn_record->recordlength);}
med.startfilereferencenumber=
*(usn*
)&buffer;}}
bool get_path
(path_map path_map,string &path,dwordlong frn)
while
(!s.
empty()
)return true;
}#endif
試了乙個檔案,frn=39406496739499215,還可以。
剩下要考慮如何快速地建立檔名到frn的對映。
#include
"usn.h"
#include
using namespace std;
intmain()
C 檔案搜尋
支援子目錄,隱藏檔案,唯讀檔案的查詢 使用方法 用命令列輸入。例如,程式名為find.exe,則命令行為 find yourfile 查詢支援萬用字元 支援命令列 define win32 winnt 0x0400 include include using namespace std ifdef ...
C 檔案搜尋
c 遍歷指定資料夾中的所有檔案 directoryinfo thefolder new directoryinfo folderfullname 遍歷資料夾 foreach directoryinfo nextfolder in thefolder.getdirectories this.listb...
C 實現硬碟檔案搜尋
譬如說要搜尋d 盤中的所有字尾為html的檔案。這裡只是簡單實現乙個抓取的類,大家可以根據需要自行擴充套件 關鍵是用到乙個遞迴函式,依此搜尋子資料夾下的檔案,按照時間儲存 public class searchbase static int ra public static void addsubd...