2011-06-23 16 views
8

'dan dizin adını alın Bazı dizinlerde bazı dosyaları araya getiren bir uygulama yaptım. Bir dizin yokken DirectoryNotFoundException'u atar. Bu özel durumu yakalarım ancak DirectoryName özelliği veya FileNotFoundException (FileName) gibi bir şeye sahip değildir. Dizin İsmini istisna özelliklerinden nasıl bulabilirim?C# DirectoryNotFoundException

+0

Eğer DirectoryNotFoundException sahipsek Rehber kesinlikle eğer dizin adı bulmak için gidiş değildir, yoksa dizin mevcut değil. Soruyu yanlış anladım mı? – Caimen

+0

@Caimen: Hangi dizin mevcut değil? – SLaks

+1

Bulmayı denediği ismi istiyor musunuz? –

cevap

5

doğal Bunu yapmanın bir yolu yok.

public static class DirectoryNotFoundExceptionExtentions 
{ 
    public static string GetPath(this DirectoryNotFoundException dnfe) 
    { 
     System.Text.RegularExpressions.Regex pathMatcher = new System.Text.RegularExpressions.Regex(@"[^']+"); 
     return pathMatcher.Matches(dnfe.Message)[1].Value; 
    } 
} 

yakalamak istisna ve bunun gibi tip uzantıyı kullanmak:

projenize bir yere bu sınıfı ekle

catch (DirectoryNotFoundException dnfe) 
{ 
    Console.WriteLine(dnfe.GetPath()); 
} 
+0

Teşekkürler! – Sp3ct3R

+0

Benim durumumda çift tırnak işareti aramak zorunda kaldım: ex.Message.Split (yeni [] {'"', '\' '}) [1] – user1027167

2

FileNotFoundException'un dosya adına sahip olması biraz tutarsız, ancak DirectoryNotFoundException dizin adına sahip değil, değil mi?

İşte bir çalışma: Özel durumu atmadan önce, özel durum dizin adını Exception'ın Data özelliğini kullanarak ilişkilendirin. o Directory.Exists

1

Kontrol Hemen sen, bir dizindeki dosyaları bulmak bir değişkene dizinin adı kaydetmek için denemeden önce. Ardından, bu dizinde görünen kod için bir try bloğu başlatın. Artık kod bloğunun atılması gereken bir dizin isminiz var.

// ... somewhere in some method that's about to search a directory. 

var dirName = directories[i]; // or something -- how do you get it before you pass it to DirectoryInfo? 

try 
{ 
    SearchDirectory(dirName); // or a block of code that does the work 
} 
catch(Exception e) 
{ 
    // at this point, you know dirName. You can log it, add it to a list of erroring 
    // directories, or whatever. You could throw here, or swallow the error after logging it, etc. 
} 
+0

Eğer kodunda değilse? Dizini kullanmaya çalışan biri ise, muhtemelen dizin adını zaten almış, bu yüzden ilk etapta bir moot noktası. –

1

sadece IDE'nizde bu bir hata basmak isteyen varsa, o zaman bunu deneyebilirsiniz: Örneğin:

Visual Studio

, Debug -> Exceptions gidin ve ardından kontrol Common Language Runtime Exceptions için Thrown kutu. Bu, yakalanmayı beklemek yerine, bir istisna durumunda sizi haklı çıkarır.

4

Bir kesmek gibi görünüyor, ancak Message özelliği yolunu ayıklayabilirsiniz. Benim için ilk önce Directory.Exists yöntemini kullanarak dizin varlığını kontrol etmeyi tercih ederim.

catch (DirectoryNotFoundException e) { 
    //Result will be: Could not find a part of the path "C:\incorrect\path". 
    Console.WriteLine(e.Message); 
    //Result will be: C:\incorrect\path 
    Console.WriteLine(e.Message.Replace("Could not find a part of the path \"","").Replace("\".","")); 
} 
+0

http://msdn.microsoft.com/en-us/library/system.io.directorynotfoundexception.aspx adresine göre, 'Message' özelliğinde yolun gerçekten göründüğü anlaşılıyor. – BinaryTox1n

+2

+1 - Uygulamaya farklı bir kültürde çalışıyorsa başarısız olacağından, buna bir hack diyebilirim. Bu, kültürün önceden bilindiği her durumda iyi bir çözüm olurdu. (Directory.Exists kontrol edilir kötü bir hack vardır, çünkü bu, herhangi bir durumda başarısız olabilir, yani aynı sorun için iki farklı hata durumu vardır!) –

+0

Genellikle, bir istisna günlüğünü doğru şekilde kullanmak için uygun bir yol olduğunu unutmayın. mesajı, ancak iletiyi ve diğer yararlı bilgileri içeren 'Exception.ToString()' öğesini çağırarak. –

0

en Directory atılan DirectoryNotFoundException Mesajı üyesi biçimini sınıf yöntemleri "Directory" girdisi "bulunamadı". Bu dizeden girişi çıkarmak zor olmamalı.

Soru thou, yöntemi tam olarak bu parametre ile çağırıyorsanız, neden özel durum parametresini almanız gerekir?