2010-09-29 16 views
15

Mam dane pochodzące z pola nvarchar bazy danych serwera SQL za pośrednictwem EF3.5. Ten ciąg służy do utworzenia nazwy pliku i trzeba usunąć nieprawidłowe znaki i wypróbować następujące opcje, ale żaden z nich nie działa. Proszę zasugerować, dlaczego jest to tak zrozumiała zagadka? Czy robię coś złego?C# Usuń nieprawidłowe znaki z nazwy pliku

Przeszedłem prawie wszystkie powiązane pytania na tej stronie .. i teraz publikuję skonsolidowane pytanie ze wszystkich sugestii/odpowiedzi z innych podobnych pytań.

UPD: Problem nie był związany. Wszystkie z tych opcji działają. Wpisując go na wiki społeczności.

public static string CleanFileName1(string filename) 
{    
    string file = filename;            
    file = string.Concat(file.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); 

    if (file.Length > 250) 
    { 
     file = file.Substring(0, 250); 
    } 
    return file; 
} 

public static string CleanFileName2(string filename) 
{ 
    var builder = new StringBuilder(); 
    var invalid = System.IO.Path.GetInvalidFileNameChars(); 
    foreach (var cur in filename) 
    { 
     if (!invalid.Contains(cur)) 
     { 
      builder.Append(cur); 
     } 
    } 
    return builder.ToString(); 
} 

public static string CleanFileName3(string filename) 
{          
    string regexSearch = string.Format("{0}{1}", 
     new string(System.IO.Path.GetInvalidFileNameChars()), 
     new string(System.IO.Path.GetInvalidPathChars())); 
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); 
    string file = r.Replace(filename, ""); 

    return file; 
}  

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

public static string CleanFileName5(string filename) 
{    
    string file = filename; 

    foreach (char c in System.IO.Path.GetInvalidFileNameChars()) 
    { 
     file = file.Replace(c, '_'); 
    }         
    return file; 
} 
+1

Co masz na myśli przez „żaden z nich nie działa”? – RedFilter

+0

Zwrócony ciąg nadal zawiera nieprawidłowe znaki .. brak nieprawidłowych znaków zwracanych przez System.IO.Path.GetInvalidFileNameChars() jest usuwany. – Bhuvan

+0

Najlepiej to wyjaśnić, jeśli pokażesz nam przykład niedziałających danych wejściowych. –

Odpowiedz

3

żadnych nieprawidłowych znaków zwróconych przez System.IO.Path.GetInvalidFileNameChars() są usunięte. - Bhuvan 5 minut temu

Pierwsza metoda ty pisał działa OK dla bohaterów w Path.GetInvalidFileNameChars(), tutaj to jest w pracy:

static void Main(string[] args) 
{ 
    string input = "abc<def>ghi\\1234/5678|?9:*0"; 

    string output = CleanFileName1(input); 

    Console.WriteLine(output); // this prints: abcdefghi1234567890 

    Console.Read(); 
} 

Przypuszczam jednak, że problem jest z jakiegoś specjalnego języka specyficzne postacie. Można spróbować rozwiązać ten problem poprzez drukowanie kodów ASCII znaków w ciąg:

string stringFromDatabase = "/5678|?9:*0"; // here you get it from the database 

foreach (char c in stringFromDatabase.ToCharArray()) 
    Console.WriteLine((int)c); 

i konsultacji z tabeli ASCII: http://www.asciitable.com/

znowu podejrzewać, że zobaczysz znaki z kody większe niż 128, a powinieneś wykluczyć te z łańcucha.

+0

Działa to dla normalnych ciągów takich jak ten, ale łańcuch nie pochodzi z pola nvarchar bazy danych. – Bhuvan

+0

Czy możesz skopiować i wkleić ciąg otrzymany z bazy danych jako komentarz? –

+0

"fbo test inwestor 12/30/92" W tym ciągu próbuję usunąć/i nie usuwa ich. Ale kiedy próbuję tego samego ... z natychmiastowego okna .. wklejając tylko ciąg. Usuwa te znaki. – Bhuvan

4

Spróbuj tego

filename = Regex.Replace(filename, "[\/?:*""><|]+", "", RegexOptions.Compiled)

+0

@DJ .. Ten sam problem z tym też ... działa dla zwykłych ciągów, ale nie dla ciągów pochodzących z nvarchar pole bazy danych – Bhuvan

+0

'filename = Regex.Replace (filename, @" [\ /?: ​​* ""><|] + "," ", RegexOptions.Compiled);' –

27

Oto funkcja używam w statycznym wspólnej klasy:

public static string RemoveInvalidFilePathCharacters(string filename, string replaceChar) 
{ 
    string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); 
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); 
    return r.Replace(filename, replaceChar); 
} 
Powiązane problemy