USN檔案搜尋(c )

2021-10-01 22:35:01 字數 1944 閱讀 7007

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