2012-06-05 56 views
12

que estoy trabajando en un programa que lee los archivos y guarda piezas de ellas de acuerdo con el título de su columna. Algunos de esos títulos tienen caracteres ilegales para los nombres de los archivos, así que escribí este fragmento de código para manejar esos problemas.C# String.Replace para eliminar caracteres no válidos

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

¿Hay una manera más agradable de hacer esto cuando no tengo 4 .Replace()? o hay algún tipo de destructor ilegal de personajes que no conozco?

Gracias!

EDITAR: No es necesario reemplazar los caracteres con nada específico. Un espacio en blanco es suficiente.

+1

Si se acaba de quitar caracteres ilegales se podría simplificar mucho, pero dado que usted está reemplazando la mayoría de ellos con otra cosa, que está limitando mucho las opciones. – Servy

+0

No necesito llamarlos algo específico, podría ser un espacio en blanco "". – Axxelsian

Respuesta

33

Las expresiones regulares son generalmente una buena manera de hacer eso, pero no cuando se está reemplazando cada personaje con algo diferente. Puede considerar reemplazarlos todos con la misma cosa y simplemente usar System.IO.Path.GetInvalidFileNameChars().

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

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

problema con esto es que si el archivo tiene más caracteres no válidos consecutivos, luego de múltiples consecutivos "_" se insertará hacer, por ejemplo, un archivo "mi \\\ archivo \\\\\\\\\\ nombre" en "my___file__________name" . Eso está bien, pero una mejor solución sería terminar como "mi_nombre_archivo". – pixel

2

Tenga una mirada en Regex.Replace here, que va a hacer todo lo que desea cuando se trata de despojar a los personajes de forma individual. El reemplazo selectivo de otras cadenas puede ser más complicado.

8

System.IO.Path. GetInvalidFileNameChars() tiene todos los caracteres no válidos.

Aquí es un método de ejemplo:

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, ""); 

Si lo que desea es eliminar los caracteres ilegales, en lugar de sustituirlos por algo más que usted puede utilizar este.

+0

no funcionará para muchas personas. en la última línea se debería poner Regex cambio del valor de alguna variable de cadena, es decir, 'archivo = Regex.Replace (nombre de archivo, patrón, "");' –

Cuestiones relacionadas