2010-02-09 18 views
16

He escrito este pequeño método para lograr el objetivo en el subj., Sin embargo, ¿hay una forma más eficiente (más simple) de hacerlo? ? Espero que esto pueda ayudar a alguien que buscará esto como yo lo hice.Eliminar caracteres no válidos (no permitidos, incorrectos) de FileName (o Directorio, Carpeta, Archivo)

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); 
} 

?

Respuesta

15

intente lo siguiente

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) no parece funcionar para mí en .NET 4. Obtuve un mensaje "No se puede acceder al método privado aquí". Salió con otro ejemplo publicado a continuación. –

+0

Agregar usando System.Linq a la parte superior. – user565710

-1

Si nos fijamos para "concisa" cuando se dice simple:

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

Dicho esto, me gustaría ir con la solución de JaredPar. Probablemente sea más fácil de leer (según el gusto, el fondo), mi intuición es que es más eficiente (aunque no estoy seguro de lo eficiente que es para pelar esa docena de caracteres inválidos de un nombre de archivo de longitud limitada) y su uso de un StringBuilder() parece ajustarse perfectamente a su ejemplo.

+3

No creo que el método Except haga lo que usted quisiera aquí. Realmente no funciona con duplicados. "El método [Excepto] devuelve aquellos elementos primero que no aparecen en el segundo. Tampoco devuelve esos elementos en el segundo que no aparecen en primer lugar". a través de http://msdn.microsoft.com/en-us/library/bb300779.aspx – ChronoPositron

+0

@ChronoPositron: Ilumíname: ¿Cuál es el problema? Quiero "esos elementos en primer lugar que no aparecen en segundo" (es decir, los caracteres que no son inválidos). No quiero "esos elementos en segundo lugar que no aparecen en primer lugar" (es decir, los caracteres no válidos que no están presentes). –

+0

@Bejamin Podszun: El problema es que Excepto funciona como un conjunto de operaciones. Por ejemplo, si paso en "aaabbb.txt" (que es un nombre de archivo válido) a su función, el valor resultante es "ab.tx". Solo conserva la primera aparición de cada letra, lo que hace que elimine mucho más que solo los caracteres no válidos; cambia el resultado esperado de la función. – ChronoPositron

12

Un enfoque diferente que es compatible con .NET 4. Vea mis comentarios arriba explicando la necesidad.

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 por no usar 'StringBuilder' –

71

Sé que esto tiene algunos años pero aquí hay otra solución de referencia.

public string GetSafeFilename(string filename) 
{ 

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

} 
+1

Unos años más tarde, pero una solución muy inteligente, de todos modos. A partir de 2014, aún el que voy a utilizar, en lugar de un Regex.Replace. = D –

+0

Sí. Mejor solución. También muestra que vale la pena leer todo el hilo (y responder viejas preguntas). Gracias, Ceres. – Lara

Cuestiones relacionadas