2015-06-22 86 views
1

我必須編寫代碼以使用c#或C++訪問隱藏的磁盤分區/卷。 但是找不到任何關於此事的幫助參考。如何訪問隱藏的分區/卷

作爲隱藏卷,它不包含「磁盤字母」,因此您不能只鍵入「C:\」並訪問它。 一個例子就是Windows附帶的「恢復分區」。你不能在探險家看到它,但它在那裏。

我的應用程序將寫入和讀取來自thoose分區的數據,我必須找到一種像「c:\」這樣的方式來處理thoose。

Volumes 5,6 are hidden partitions

在上述圖像,卷5和6被隱藏分區。 我發現在計算器這個鏈接,但它只是「表」德分區: https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx

編輯

的問題是:即使使用WMI作爲suguested我便無法找到如何篩選音量當查找文件時。 例如,select * from win32_DataFile將列出機器中的所有文件。

我認爲應該是一種使用其ID(或名稱)過濾卷的方法。 喜歡的東西:

select * from win32_DataFile 
where volumeId = '\\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\' 

或者一個更華麗的方式,如:

var files = Directory.GetFiles(@"\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\"); 

而且,我發現了一個外觀極好awenser約分區和卷(他們是不一樣的東西) https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how-do-i-find-the-partition-guid?forum=winservergen

EDIT2

正如哈里所說,使用「\。\ Volume ....」是恢復文件的好方法。但我找不到使用c#編寫(創建)新文件的方法。 到目前爲止最好的方法是使用pinvoke來C++ CreateFile方法/句柄。


有什麼建議嗎?

+0

「找不到對此事的任何幫助,參考」 - 是不是鏈接你有一個問題給你足夠的暗示下一次搜索?您是否閱讀過樣本中使用的每個函數的詳細信息?在這一點上,你的問題可能是非常廣泛的SO ... –

+0

在C++中,您可以使用'GetLogicalDriveStrings' http://stackoverflow.com/a/18573199/4603670和'GetDriveType' –

回答

1

FindFirstVolume() API返回系統上每個卷的根目錄的路徑。

例如,該代碼打印路徑先容,並在該卷的根目錄下的第一個文件的名稱:

HANDLE h1, h2; 
    wchar_t volpath[4096]; 
    WIN32_FIND_DATA find_data; 

    h1 = FindFirstVolume(volpath, _countof(volpath)); 

    printf("%ws\n", volpath); 

    wcscat_s(volpath, _countof(volpath), L"*.*"); 

    h2 = FindFirstFile(volpath, &find_data); 

    printf("%ws\n", find_data.cFileName); 

(在生產代碼,你需要添加錯誤檢查等)

補遺

FindFirstVolume返回這樣的路徑:\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\

如果您在C++中使用Win32 API(CreateFile等),您可以直接使用該路徑,但由於其中的錯誤或限制。它不適用於Directory.GetFiles()等文件管理類。 (你可以P/Invoke來的Win32 API的,當然,不過這很尷尬。)

相反,您可以通過更換出現在同一個點的路徑開頭的問號解決該問題:

var files = Directory.GetFiles(@"\\.\Volume{6ff7748e-78db-4838-8896-254b074918f5}\"); 
+0

Harry,非常感謝您使用「\\。\」對GetFiles工作正常。關於編寫文件,這是更深的我猜。我嘗試使用File.Create和其他Stream低級別方法,但一直得到此異常:「FileStream不會打開Win32設備,如磁盤分區和磁帶驅動器,避免在路徑中使用」\\。\「。我想唯一的方法是使用CreateFile C++方法。 –

+0

Drat。您的程序是否可以將卷臨時安裝到某個文件夾?或者如果你有管理員權限,你可以創建一個目錄符號鏈接,這將是一個不太乾擾的方法。 –

+0

我不認爲這將是我的應用程序的好方法。任何方式您awenser幫助了很多。我可能會在某些情況下使用pinvoke,並且可能會重新編寫c#File類來支持將來的這種操作。順帶感謝您的幫助! –

1

如果您的程序特定於Windows,則可以使用WMI。我在WMI方面做了很多工作,並且非常方便地執行任何操作或獲取有關Windows系統的數據。

首先,您可以下載wmiexplorer以查看可用的數據和類。相關的命名空間將爲root\cimv。在那裏,你可以找到各種有趣的課程爲您提供:

  • Win32_LogicalDisk:包含所有磁盤,也隱藏的人。
  • CIM_Directory:包含所有目錄(據我也知道,從隱藏的磁盤)
  • ​​:包含所有文件(我也覺得這其中也包含隱藏磁盤中的文件)
  • 還有更多的類你可以使用例如檢索文件的權限...微軟有着相當不錯的documentation

接下來,你可以實現你想要的WMI查詢到您的C#(或VB.NET)程序。例如,這一次將打印的所有磁盤:

WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wqlQuery); 

foreach (ManagementObject disk in searcher.Get()) 
{ 
    Console.WriteLine(disk.ToString()); 
} 

正如你所看到的,WMI支持像SQL查詢(儘管它不是那麼強大......)

WMI還支持methots大多數IST類。例如,您可以檢查是否有錯誤的每個磁盤:

foreach (ManagementObject disk in searcher.Get()) 
{ 
    if(shouldCheckThisDisk) 
     disk.Chkdsk(); 
} 
+0

感謝您的建議托馬斯。我設法使用WMI查詢來檢索pettry有用信息。但無法找到列出「雲端硬盤的所有文件」的方法。因爲當驅動器隱藏時,「驅動程序」屬性爲空或空。我無法找到一種方法來過濾這些信息,並且通過Path過濾器可以將整個機器的所有文件都帶出來,呵呵。任何方式非常感謝 –