2017-02-01 2 views
0

Wie kann ich alle Laufwerke außer DVD-Laufwerke ohne DriveInfo.GetDrives auflisten? Ich verwende die Unity-Game-Engine und es wird ein Fehler auf GetDrives ausgelöst:Alle Laufwerke außer DVD-Laufwerk ohne DriveInfo.GetDrives auflisten

NotImplementedException: Die angeforderte Funktion ist nicht implementiert. System.IO.DriveInfo.WindowsGetDrives

Ich suche nach einer Vermeidung des Problems. Ich habe gelesen, dass Winbase.h eine DriveType-Enumeration hat, kann ich das irgendwie benutzen?

Antwort

1

Sie können nicht, ohne Plattform Unabhängigkeit zu opfern.

Die folgenden werden alle Laufwerke erhalten. Ich glaube nicht, dass es eine plattformunabhängige Art und Weise „alle Laufwerke außer DVD“ zu bekommen:

string[] drives = Directory.GetLogicalDrives(); 

Sie winbase.h erwähnt. Das ist C++ und bindet Sie an eine bestimmte Plattform (Windows). Sie können dies tun, mit p/invoke, aber Sie müssen plattformabhängigen Code schreiben. Ich würde P/invoke nicht für Anfänger empfehlen. Es ist ein fortgeschrittenes Thema, das ziemlich schnell schwierig werden kann.

Was bedeutet "plattformabhängig"? Sie müssten Code für Windows, Code für Linux, Code für Mac und alle anderen Plattformen schreiben, auf denen Ihr Code ausgeführt wird. Eines der Verkaufsargumente von Unity ist, dass Sie den Code einmal schreiben können und erwarten, dass es auf einer Vielzahl verschiedener Plattformen gleich läuft.

+0

Danke. Ich habe diesen Beitrag https://bytes.com/topic/c-sharp/answers/257251-how-detect-hard-drives gefunden, bevor ich hier gepostet habe, wusste aber nicht, welchen Namespace zu verwenden ist, Ihr Tipp über p/invoke hat mir geholfen finde es heraus. Ich werde auch eine Antwort für andere Unity-Benutzer veröffentlichen, falls der Link nicht mehr funktioniert. – Absinthe

+0

Ich bin froh zu hören, dass meine Antwort hilfreich war. – Amy

0

Dank Amys Antwort, die ich this post von CR Timmons Beratung gefunden, Inc. getestet und arbeitet unter Windows, würde ich Ihnen dankbar, wenn jemand auf Mac überprüfen könnte, wenn es auch funktioniert:

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); 

Beispiel Nutzung:

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

Nein, dieser DllImport funktioniert nicht auf einem Mac (DLLs sind im Allgemeinen Windows-spezifisch). Es wird komplett anderer Code benötigt, der in der gleichen Richtung fließt (ein zweiter DllImport wie der erste, aber etwas anders, um auf einem Mac zu funktionieren). Die Art und Weise, wie dies normalerweise gehandhabt wird, geschieht durch die Compiler-Direktiven '# if' und' #endif', die Ihren Code abhängig von Compiler-Flags aktivieren/deaktivieren. – Amy

+0

Beachten Sie auch, dass die Verwendung von p/invoke erfordert, dass Ihre Software im Modus "Voll vertrauenswürdig" ausgeführt wird. Dieses * wahrscheinlich * wird kein Problem sein, aber ich bringe es nur als Kopf hoch. – Amy

+0

Gut zu wissen, danke – Absinthe