2012-02-23 59 views
3

我有一個閃存卡,需要計算驅動器整個內容的校驗和。如何逐點讀取整個磁盤的內容

如果我可以獲得整個驅動器的流,我可以一點一點讀取它。

有沒有人知道是否有這樣做的API?

到目前爲止我看到的一切都需要我打開一個文件。

有什麼辦法可以一點一點讀取整個驅動器的內容?

+0

你可以用WMI來做到這一點..你熟悉WMI嗎 – MethodMan 2012-02-23 17:05:58

回答

4

我不確定在.NET中是否有直接支持,但可以使用Platform Invoke來調用Win32 API函數。 CreateFile()應該是你的起點,因爲它可以讓你獲得一個句柄物理驅動器:

您可以使用CreateFile函數打開一個物理磁盤驅動器或卷,其 返回一個直接訪問存儲設備(DASD)句柄,該句柄可與 DeviceIoControl函數一起使用。這使您可以直接訪問磁盤或卷,例如分區表等磁盤元數據。

的文件通知的限制(如需要管理員權限),並提示在如何從卷號一個物理驅動器號,你等

0

「流」是一個抽象正常假定存在一個文件系統,所以從概念上講,它不是那麼簡單。

在Windows上,您可能希望從查看Windows Defragmentation API開始。這裏有幾個鏈接,我發現:

+3

實際上,'stream'抽象的全部意義在於它並不假設文件系統。您可以將內存中的流,文件流和串行端口都視爲相同。如果操作系統允許你使用整個磁盤。 – MSalters 2012-02-24 10:00:19

7

如果你想編寫C#代碼,那麼你就必須使用P/Invoke來從磁盤讀取數據(RAW訪問)。

有什麼辦法可以一點一點地讀取整個驅動器的內容嗎?

你必須使驅動之間的差異(您的閃存卡的邏輯表示,一個安裝了一個文件系統,通過指定的驅動器盤符)和物理您的閃存卡的表示,由指定的磁盤號)。

my previous answer有關如何從一個驅動器/磁盤讀取RAW數據:

基本上,你首先需要一個句柄到磁盤/驅動器:

// For a DISK: 
IntPtr hDisk = CreateFile(string.Format("\\\\.\\PhysicalDrive{0}", diskNumber), 
    GenericRead, 
    Read | Write, 
    0, 
    OpenExisting, 
    0, 
    IntPtr.Zero); 

// For a DRIVE 
IntPtr hDrive = NativeMethods.CreateFile(
    string.Format("\\\\.\\{0}:", DriveLetter) 
    GenericRead, 
    Read | Write, 
    IntPtr.Zero, 
    OpenExisting, 
    0, 
    IntPtr.Zero); 

然後使用SetFilePointerEx(所以你可以移動要讀取的偏移量),ReadFile(用從磁盤/驅動器讀取的字節填充緩衝區),CloseHandle(關閉由CreateFile打開的句柄)。

通過塊讀取磁盤/驅動器(基本上,從偏移量「0」到偏移「磁盤/驅動器大小」的循環)。

什麼是重要的(或ReadFile將始終失敗):讀取塊的大小必須是磁盤(通常爲512個字節)的扇區大小的倍數。