C#實現快速查詢文件的方法_第1頁
C#實現快速查詢文件的方法_第2頁
C#實現快速查詢文件的方法_第3頁
C#實現快速查詢文件的方法_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第C#實現快速查詢文件的方法相信使用過Everything的人都對其超快的搜索速度印象非常深刻,它的主要原理是通過掃描NTFS磁盤的USNJournal讀取的文件列表,而不是磁盤目錄,由于USNJournal非常小,因此能實現快速搜索。

由于.Net程序的Dll基本上是通用的,在C#中也可以直接使用它。

publicclassMFTScanner

privatestaticIntPtrINVALID_HANDLE_VALUE=newIntPtr(-1);

privateconstuintGENERIC_READ=0x80000000;

privateconstintFILE_SHARE_READ=0x1;

privateconstintFILE_SHARE_WRITE=0x2;

privateconstintOPEN_EXISTING=3;

privateconstintFILE_READ_ATTRIBUTES=0x80;

privateconstintFILE_NAME_IINFORMATION=9;

privateconstintFILE_FLAG_BACKUP_SEMANTICS=0x2000000;

privateconstintFILE_OPEN_FOR_BACKUP_INTENT=0x4000;

privateconstintFILE_OPEN_BY_FILE_ID=0x2000;

privateconstintFILE_OPEN=0x1;

privateconstintOBJ_CASE_INSENSITIVE=0x40;

privateconstintFSCTL_ENUM_USN_DATA=0x900b3;

[StructLayout(LayoutKind.Sequential)]

privatestructMFT_ENUM_DATA

publiclongStartFileReferenceNumber;

publiclongLowUsn;

publiclongHighUsn;

[StructLayout(LayoutKind.Sequential)]

privatestructUSN_RECORD

publicintRecordLength;

publicshortMajorVersion;

publicshortMinorVersion;

publiclongFileReferenceNumber;

publiclongParentFileReferenceNumber;

publiclongUsn;

publiclongTimeStamp;

publicintReason;

publicintSourceInfo;

publicintSecurityId;

publicFileAttributesFileAttributes;

publicshortFileNameLength;

publicshortFileNameOffset;

[StructLayout(LayoutKind.Sequential)]

privatestructIO_STATUS_BLOCK

publicintStatus;

publicintInformation;

[StructLayout(LayoutKind.Sequential)]

privatestructUNICODE_STRING

publicshortLength;

publicshortMaximumLength;

publicIntPtrBuffer;

[StructLayout(LayoutKind.Sequential)]

privatestructOBJECT_ATTRIBUTES

publicintLength;

publicIntPtrRootDirectory;

publicIntPtrObjectName;

publicintAttributes;

publicintSecurityDescriptor;

publicintSecurityQualityOfService;

////MFT_ENUM_DATA

[DllImport("kernel32.dll",ExactSpelling=true,SetLastError=true,CharSet=CharSet.Auto)]

privatestaticexternboolDeviceIoControl(IntPtrhDevice,intdwIoControlCode,refMFT_ENUM_DATAlpInBuffer,intnInBufferSize,IntPtrlpOutBuffer,intnOutBufferSize,refintlpBytesReturned,IntPtrlpOverlapped);

[DllImport("kernel32.dll",SetLastError=true,CharSet=CharSet.Auto)]

privatestaticexternIntPtrCreateFile(stringlpFileName,uintdwDesiredAccess,intdwShareMode,IntPtrlpSecurityAttributes,intdwCreationDisposition,intdwFlagsAndAttributes,IntPtrhTemplateFile);

[DllImport("kernel32.dll",ExactSpelling=true,SetLastError=true,CharSet=CharSet.Auto)]

privatestaticexternInt32CloseHandle(IntPtrlpObject);

[DllImport("ntdll.dll",ExactSpelling=true,SetLastError=true,CharSet=CharSet.Auto)]

privatestaticexternintNtCreateFile(refIntPtrFileHandle,intDesiredAccess,refOBJECT_ATTRIBUTESObjectAttributes,refIO_STATUS_BLOCKIoStatusBlock,intAllocationSize,intFileAttribs,intSharedAccess,intCreationDisposition,intCreateOptions,intEaBuffer,

intEaLength);

[DllImport("ntdll.dll",ExactSpelling=true,SetLastError=true,CharSet=CharSet.Auto)]

privatestaticexternintNtQueryInformationFile(IntPtrFileHandle,refIO_STATUS_BLOCKIoStatusBlock,IntPtrFileInformation,intLength,intFileInformationClass);

privateIntPtrm_hCJ;

privateIntPtrm_Buffer;

privateintm_BufferSize;

privatestringm_DriveLetter;

privateclassFSNode

publiclongFRN;

publiclongParentFRN;

publicstringFileName;

publicboolIsFile;

publicFSNode(longlFRN,longlParentFSN,stringsFileName,boolbIsFile)

FRN=lFRN;

ParentFRN=lParentFSN;

FileName=sFileName;

IsFile=bIsFile;

privateIntPtrOpenVolume(stringszDriveLetter)

IntPtrhCJ=default(IntPtr);

/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論