2013-06-27 18 views
11

Come verificare l'unità è presente nel sistema dalla stringa specificata in WPF. Ho provato quanto segueVerifica unità esistente (percorso stringa)

Es:FileLocation.Text = "K:\TestDrive\XXX";

if (!Directory.Exists(FileLocation.Text)) 
{ 
     MessageBox.Show("Invalid Directory", "Error", MessageBoxButton.OK); 
     return; 
} 

sta controllando percorso completo ma it should check "K:\" from the text. La prego di guidarmi

EDIT 1: "K: \ TestDrive \ XXX" non è statica

EDIT 2: ho provato il basso, nel mio sistema che sto avendo 3 drives C, D and E ma mostra false.

Environment.SystemDirectory.Contains("D").ToString(); = "False" 
+2

Assicurati che i tuoi campioni abbiano un codice C# ragionevole. Cioè '" K: \ Test ... "' è una costante di stringa un po 'sospetta: dovrebbe essere '@" K: \ Test ... "' o '" K: \\ Test ... "', controllando la presenza di 'true'/'false' non richiede la chiamata per' ToString' e sicuramente non il confronto tra maiuscole e minuscole con strano '; = 'operatore. –

+0

@AlexeiLevenkov: Grazie per il tuo commento, ma ho appena dato per esempio – Ponmalar

+4

Come su 'Directory.Exists (Path.GetPathRoot (pathGoesHere)) '? – Alxandr

risposta

22
string drive = Path.GetPathRoot(FileLocation.Text); // e.g. K:\ 

if (!Directory.Exists(drive)) 
{ 
    MessageBox.Show("Drive " + drive + " not found or inaccessible", 
        "Error", MessageBoxButton.OK); 
    return; 
} 

Ovviamente, ulteriori controlli di integrità (la radice del percorso ha almeno tre caratteri, è il secondo a due punti) dovrebbero essere aggiunti, ma questo verrà lasciato come esercizio al lettore.

+2

[Path.GetPathRoot] (http://msdn.microsoft.com/en-us/library/system.io.path.getpathroot.aspx) è migliore della sottostringa ... –

+0

@AlexeiLevenkov: Brillante, grazie. Ho aggiornato la mia risposta. – Heinzi

+0

Funziona bene ma se il percorso ha solo \\\\, fallisce e dovrebbe mostrare un avviso se il percorso ha '/' – Ponmalar

0

È possibile controllare le unità in C# come questo

foreach (var drive in DriveInfo.GetDrives()) 
    { 
     //Code goes here 
    } 
1

si può fare seguire

bool isDriveExists(string driveLetterWithColonAndSlash) 
{ 
    return DriveInfo.GetDrives().Any(x => x.Name == driveLetterWithColonAndSlash); 
} 
+0

Si prega di vedere la mia modifica 1 – Ponmalar

+0

Qual è il problema? Non è possibile sostituire "@K: \" con un'altra lettera di unità? – DreamChild

2

si può provare questo ....

MessageBox.Show(Environment.SystemDirectory.Contains("D").ToString()); 
+0

Ho provato e funziona ..... –

+1

vedere edit 2 – Ponmalar

+2

Questo è ovviamente sbagliato - il confronto del drive dovrebbe essere case sensitive "lettera di accompagnamento" + ":" per evitare casi in cui la lettera è entrata a far parte del percorso. –

1

Questo perché Environment.SystemDirectory.XXXXX è tutto su dove è installato il sistema/Windows ... non per l'intero HD.

per questo si può utilizzare .....

foreach (var item in System.IO.DriveInfo.GetDrives()) 
    { 
     MessageBox.Show(item.ToString()); 
    } 

mostrerà tutte le unità, tra cui USBs che sono collegati .....

0

È possibile utilizzare Environment.GetLogicalDrives() per ottenere un string[] di logica guida nel tuo sistema.

var drive = Path.GetPathRoot(FileLocation.Text); 
if (Environment.GetLogicalDrives().Contains(drive, StringComparer.InvariantCultureIgnoreCase)) 
{ 
     MessageBox.Show("Invalid Directory", "Error", MessageBoxButton.OK); 
     return; 
} 
0

Suppongo che ciò dipenda da cosa esattamente speri di ottenere. Se si sta tentando di ripetere le unità e verificare che ciascuna unità esista, allora Environment.GetLogicalDrives() o DriveInfo.GetDrives() è appropriato in quanto consente di scorrere le unità.

Tuttavia, se tutto ciò che interessa è il test per verificare se UN'unità esiste per un determinato percorso, ottenere l'intero elenco di unità per verificare se è contenuto è un po 'indietro. Vorresti utilizzare Directory.Exists() perché controlla solo se esiste quel singolo percorso.

bool DriveExists(string fileLocation) { 
    string drive = Path.GetPathRoot(fileLocation); // To ensure we are just testing the root directory. 

    return Directory.Exists(drive); // Does the path exist? 
} 
Problemi correlati