2017-02-01 62 views
0

如何在不使用DriveInfo.GetDrives的情況下列出除DVD驅動器以外的所有磁盤?我使用的是Unity遊戲引擎,它在GetDrives上引發錯誤:列出除DVD驅動器以外的所有磁盤,而不使用DriveInfo.GetDrives

NotImplementedException:未實現所請求的功能。 System.IO.DriveInfo.WindowsGetDrives

我正在尋找解決方法。我讀過Winbase.h有一個DriveType枚舉,有什麼方法可以使用它嗎?

回答

1

你不能不犧牲平臺獨立性。

以下將獲得全部驅動器。我不認爲有一個平臺無關的方式獲得「除DVD以外的所有驅動器」:

string[] drives = Directory.GetLogicalDrives(); 

您提到的Winbase.h。這就是C++,並且會將你與特定平臺(Windows)聯繫起來。你可以做到這一點,使用p/invoke,但你將不得不編寫平臺相關的代碼。我不會爲初學者推薦P/invoke。這是一個高級話題,可以很快得到解決。

「依賴於平臺」是什麼意思?你將不得不編寫Windows代碼,Linux代碼,Mac代碼以及代碼將運行的任何其他平臺。 Unity的賣點之一是你可以編寫代碼一次,並期望它在各種不同的平臺上運行相同。

+0

謝謝。在發佈之前,我在這裏發現了這個帖子https://bytes.com/topic/c-sharp/answers/257251-how-detect-hard-drives,但不知道要使用哪個命名空間,關於p/invoke的提示幫助了我想辦法。我還會爲其他Unity用戶發佈一個答案,以防鏈接失效。 – Absinthe

+0

我很高興聽到我的回答很有幫助。 – Amy

0

感謝Amy的回答我的CR蒂蒙斯諮詢發現this post,公司經過測試,在Windows上工作,我會很感激,如果有人在Mac上可以檢查它是否工作太:

public enum DriveType : int 
{ 
Unknown = 0, 
NoRoot = 1, 
Removable = 2, 
Localdisk = 3, 
Network = 4, 
CD = 5, 
RAMDrive = 6 
} 

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
public static extern int GetDriveType(string lpRootPathName); 

用法示例:

using System; 
using System.Runtime.InteropServices; 

void GetDrives() 
{ 
    foreach (string s in Environment.GetLogicalDrives()) 
    Console.WriteLine(string.Format("Drive {0} is a {1}.", 
    s, Enum.GetName(typeof(DriveType), GetDriveType(s)))); 
} 
+0

不,那個DllImport不能在Mac上工作(DLL通常是特定於Windows的)。它將需要完全不同的代碼沿着相同的線路流動(第二個DllImport與第一個DllImport類似,但在Mac上工作稍有不同)。通常這種處理方式是通過'#if'和'#endif'編譯器指令來實現的,這些指令可以根據編譯器標誌激活/取消激活你的代碼。 – Amy

+0

還要注意,使用p/invoke要求您的軟件以「完全信任」模式運行。這*可能*不會是一個問題,但我提起來就像一個人擡起頭一樣。 – Amy

+0

很高興知道,謝謝 – Absinthe

相關問題