2012-06-05 12 views
12

Ich arbeite an einem Programm, das Dateien liest und Teile davon entsprechend dem Titel ihrer Spalte speichert. Einige dieser Titel haben ungültige Zeichen für Dateinamen. Daher habe ich diesen Code geschrieben, um diese Probleme zu beheben.C# string.replace zum Entfernen von ungültigen Zeichen

string headerfile = saveDir + "\\" + tVS.Nodes[r].Text.Replace("\"", "").Replace 
       ("/","").Replace(":"," -").Replace(">","(Greater Than)") + ".csv"; 

Gibt es eine schönere Art und Weise, dies zu tun, wo ich nicht über 4 .Replace()? oder gibt es eine Art von eingebautem illegalen Zeichenentferner, von dem ich nichts weiß?

Danke!

EDIT: Es muss nicht die Zeichen durch etwas bestimmtes ersetzen. Ein Leerzeichen ist ausreichend.

+1

Wenn Sie nur wurden illegal Zeichen entfernen Sie es viel vereinfachen könnte, aber wenn man bedenkt, dass Sie die meisten von ihnen mit etwas anderem sind zu ersetzen, werden Sie eine Menge von Optionen zu begrenzen. – Servy

+0

Ich brauche sie nicht etwas Spezifisches zu nennen, es könnte nur ein Leerzeichen sein "". – Axxelsian

Antwort

33

Reguläre Ausdrücke sind in der Regel eine gute Möglichkeit, das zu tun, aber nicht, wenn Sie jedes Zeichen mit etwas anderem sind zu ersetzen. Sie könnten erwägen, sie alle durch dasselbe zu ersetzen und einfach System.IO.Path.GetInvalidFileNameChars() zu verwenden.

string filename = tVS.Nodes[r].Text; 

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

Problem dabei ist, dass, wenn die Datei mehr aufeinanderfolgende ungültige Zeichen hat, dann mehrere aufeinanderfolgende „_“ wird eine Datei „my \\\ Datei \\\\\\\\\\ namen“ in „my___file__________name“ macht zum Beispiel eingesetzt werden, . Das ist in Ordnung, aber eine bessere Lösung wäre, es als "my_file_name" enden zu lassen. – pixel

2

Werfen Sie einen Blick auf Regex.Replace here, wird es alles, was Sie wünschen, tun, wenn es einzeln Zeichen Strippen herauskommt. Selektive Ersetzung anderer Strings kann kniffliger sein.

8

hat alle ungültigen Zeichen.

Hier ist ein Beispiel-Methode:

public static string SanitizeFileName(string fileName, char replacementChar = '_') 
{ 
    var blackList = new HashSet<char>(System.IO.Path.GetInvalidFileNameChars()); 
    var output = fileName.ToCharArray(); 
    for (int i = 0, ln = output.Length; i < ln; i++) 
    { 
     if (blackList.Contains(output[i])) 
     { 
      output[i] = replacementChar; 
     } 
    } 
    return new String(output); 
} 
2
string charsToRemove = @"\/:";TODO complete this list 

string filename; 

string pattern = string.format("[{0}]", Regex.Escape(charsToRemove)); 
Regex.Replace(filename, pattern, ""); 

Wenn Sie nur illegal Zeichen löschen wollen, anstatt sie mit etwas anderem ersetzen Sie diese nutzen können.

+0

wird es nicht für viele Leute funktionieren. in letzter Linie sollten Sie setzen Regex zu einem gewissen String Variablenwert geändert, das heißt 'filename = Regex.Replace (Dateiname, Muster,„“);' –

Verwandte Themen