2010-02-09 13 views
16

Bu küçük yöntemi, subj. Içindeki hedefe ulaşmak için yazdım, ancak bunu yapmanın daha verimli (daha basit) yolu var mı ? Umarım bu, benim yaptığım gibi bunu araştıracak birine yardım edebilir.Geçersiz (izin verilmeyen, bozuk) karakterleri DosyaAdı'ndan (veya Dizin, Klasör, Dosya) kaldırın

var fileName = new System.Text.StringBuilder(); 
fileName.Append("*Bad/\ :, Filename,? "); 
// get rid of invalid chars 
while (fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) > -1) 
{ 
    fileName = fileName.Remove(fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()), 1); 
} 

? sözü

public string StripInvalidChars(string filename) { 
    return new String(
    filename.Except(System.IO.Path.GetInvalidFileNameChars()).ToArray() 
); 
} 

, ben JaredPar solüsyonu ile gitmek istiyorum: Eğer basit derken siz "özlü" için bakarsak

cevap

15

aşağıdaki

public string MakeValidFileName(string name) { 
    var builder = new StringBuilder(); 
    var invalid = System.IO.Path.GetInvalidFileNameChars(); 
    foreach (var cur in name) { 
    if (!invalid.Contains(cur)) { 
     builder.Append(cur); 
    } 
    } 
    return builder.ToString(); 
} 
+2

invalid.Contains (cur) .NET 4. benim için çalışmıyor gibi görünmüyor. "Özel yöntem buraya erişilemiyor" iletisi var. Aşağıda yayınlanan başka bir örnekle geldi. –

+0

Sistem.Linq kullanarak ekleyin. – user565710

-1

deneyin. Okumak daha kolay (tat, arka plana bağlı olarak), bağırsak hislerimin daha verimli olması (sınırlı uzunluktaki bir dosya adından bu düzinelerce geçersiz karakter kümesinin ne kadar verimli bir şekilde soyulması gerektiğini bilmiyorum) ve kullanımı StringBuilder(), örneğinize mükemmel bir şekilde uyuyor gibi görünüyor.

+3

Except yönteminin burada yapmak istediğinizi yaptığına inanmıyorum. Çoğaltmalarla gerçekten çalışmıyor. "[The Except] yöntemi, ilk olarak, ikinci olarak görünmeyen öğeleri döndürür. Bu öğeleri, ilk olarak görünmeyen ikinci öğelere de döndürmez." http://msdn.microsoft.com/en-us/library/bb300779.aspx – ChronoPositron

+0

@ChronoPositron: Enlighten me: Sorun nedir? "İkincisi ilk olarak görünmeyen öğeler" (yani geçersiz olmayan karakterler) istiyorum. "İlk olarak görünmeyen ikinci elemanlar" (yani, mevcut olmayan geçersiz karakterler) istemiyorum. –

+0

@Bejamin Podszun: Sorun şu ki, set dışı bir işlem olarak çalışıyor. Örneğin, işlevinize "aaabbb.txt" (geçerli bir dosya adı) iletirseniz, sonuç "ab.tx" olur. Sadece her harfin ilk oluşumunu, sadece geçersiz karakterlerden çok daha fazlasını çıkarmasını sağlar; Fonksiyonun beklenen sonucunu değiştirir. – ChronoPositron

12

.NET 4 ile uyumlu olan farklı bir yaklaşım. Gerektiğimi açıklayan yukarıdaki yorumlarıma bakın.

public static string ScrubFileName(string value) 
{ 
    var sb = new StringBuilder(value); 
    foreach (char item in Path.GetInvalidFileNameChars()) 
    { 
     sb.Replace(item.ToString(), ""); 
    } 
    return sb.ToString(); 
} 
+0

-1 'StringBuilder' kullanmıyoruz –

71

Ben bunu birkaç yaşındadır ama burada referans için başka bir çözüm olduğunu biliyorum.

public string GetSafeFilename(string filename) 
{ 

    return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); 

} 
+1

Birkaç yıl sonra, ama yine de çok akıllı bir çözüm. 2014 itibariyle, hala bir Regex.Replace yerine kullanacağım. = D –

+0

Evet. En iyi çözüm. Aynı zamanda, tüm iş parçacığını okumayı (ve eski soruları yanıtlamak) ödediğini gösterir. Teşekkürler Ceres. – Lara

İlgili konular