2013-08-18 27 views
0

我想知道什麼物理媒體文件(通過文件名或處理)。如何找出文件的物理驅動器?

我讀過here,我可以通過調用DeviceIoControl來確定給定分區句柄的物理驅動器。

但是,如何從文件名獲得分區句柄? (因爲NTFS允許在文件夾中裝入分區,所以我不能簡單地依靠驅動器盤符。)

我問的原因是,使用異步方法時,將文件複製到另一個物理驅動器時速度最快,但在與更大的緩衝區同步完成時,它是最快的。我想編寫一個函數來確定給定文件和目標的最佳複製算法。

+0

我希望,你將不得不尋找連接的所有媒體文件,因爲Windows不保留一個將文件名映射到音量字母的表格。 –

+0

我希望你的意思是*邏輯*驅動器。例如,我的SQL服務器的主數據存儲位於三個運行RAID5的SAS 15K驅動器上。存儲在RAID上的文件在所有驅動器上同時傳播(交叉傳播)。 – WhozCraig

+0

@WhozCraig是的,但我仍然想使用同步複製,如果兩個邏輯驅動器駐留在同一個物理驅動器上(如果可能的話)。 –

回答

1

Windows中的卷通常映射到驅動器號(網絡共享除外)。

您可以使用CreateFile()只傳入驅動器盤符路徑(即:\\。\ C:\)在源和目標上創建卷文件設備句柄。使用返回的句柄DeviceIoControl()。比較來源和目的地之間的物理驅動器,你應該很好。

討論這裏解釋:「爲了獲取卷的物理驅動器標識符,開放......」 http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

+1

實際上,卷被映射到驅動器號,但它們不具有映射。未映射卷仍可通過使用Win32 API旁路前綴'\\。\'通過NT名稱空間訪問。他們可以創建,打開,閱讀和書寫。 – wallyk

+0

@wallyk澄清,謝謝。 –

+0

我無法通過驅動器盤符進行操作,因爲卷可能裝載在另一個卷的目錄中。我可能需要使用'GetVolumePathName'和'GetVolumeNameForVolumeMountPoint'對其進行排序,然後解析卷名(這是符號鏈接到「\ Device \ HarddiskVolumeX」)。然後我可以枚舉「HarddiskYPartitionZ」設備,看看哪一個指向我剛剛解決的設備X.然後Y是我的物理驅動器。 –

相關問題