2013-06-27 27 views
11

システムには、ドライブを確認する方法がWPFの指定された文字列から存在します。私は、次のドライブが存在するか確認する(文字列パス)

例を試してみました:FileLocation.Text = "K:\TestDrive\XXX";

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

は、それは完全なパスが、it should check "K:\" from the textをチェックしています。あなたが私に案内してもらえ

EDIT 1: "K:\テストドライブ\ XXXは" 静的ではありませんEDIT 2

:私が試した以下、私のシステムでは、私は3 drives C, D and Eを抱えているが、それはを示しています。

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

サンプルに合理的なC#コードがあることを確認してください。私。 '' K:\ Test ... ''や' 'K:\\ Test ...''でなければなりません。/'false'は' ToString'の呼び出しを必要とせず、間違って '奇妙な'との大文字と小文字を区別しません。 = '演算子。 –

+0

@AlexeiLevenkov:あなたのコメントをありがとうが、私はちょうど例として与えた – Ponmalar

+4

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

答えて

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

もちろん、追加の健全性チェック(パスルートに少なくとも3文字があり、2番目はコロンです)を追加する必要がありますが、これは読者の練習として残しておきます。

+2

[Path.GetPathRoot](http://msdn.microsoft.com/en-us/library/system.io.path.getpathroot.aspx)はサブ文字列よりも優れています。 –

+0

@AlexeiLevenkov:Brilliant、ありがとう。私は私の答えを更新しました。 – Heinzi

+0

うまく動作していますが、パスに\\\\しかない場合は失敗し、パスに '/'がある場合は警告が表示されます。 – Ponmalar

0

あなたは....あなたが

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

のようにC#でのドライブを確認することができます

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

編集1をご覧ください – Ponmalar

+0

どうしたのですか? 「@ K:\」を別のドライブ文字で置き換えることはできませんか? – DreamChild

2

あなたはこれを試すことができ従ってくださいすることができ、この

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

私はそれをテストして、作業しています..... –

+1

edit 2 – Ponmalar

+2

これは明らかに間違っています - ドライブの比較は大文字と小文字を区別しません(したがって、 'Contains'ではなく' IndexOf'を比較タイプで使用する必要があります)。 "ドライブレター" + ":"は、レターがパスの一部になった場合を避けるためです。 –

1

Environment.SystemDirectory.XXXXXは、システム/ウィンドウがインストールされている場所のことです。これは、HD全体ではないためです。あなたが使用することができ、このため

.....

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

それが接続されているUSBSを含むすべてのドライブを表示します.....

0

あなたは論理のstring[]を取得するためにEnvironment.GetLogicalDrives()を使用することができますシステム内のドライブ。

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

これは、あなたが達成しようとしているものが何であるかによって異なります。ドライブを繰り返しテストして各ドライブが存在することを確認する場合は、ドライブを繰り返し処理できるので、Environment.GetLogicalDrives()またはDriveInfo.GetDrives()が適切です。

ただし、特定のパスに対して1つのドライブが存在するかどうかを確認することが重要な場合は、ドライブのリスト全体を取得してそのドライブが含まれているかどうかを確認してください。その単一のパスが存在するかどうかをチェックするだけで、Directory.Exists()を使用することになります。

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? 
} 
関連する問題