¿Cómo eliminar caracteres ilegales de rutas y nombres de archivos?
Necesito una forma sólida y sencilla de eliminar rutas ilegales y caracteres de archivo de una cadena simple. He usado el siguiente código pero no parece hacer nada, ¿qué me falta?
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";
illegal = illegal.Trim(Path.GetInvalidFileNameChars());
illegal = illegal.Trim(Path.GetInvalidPathChars());
Console.WriteLine(illegal);
Console.ReadLine();
}
}
}
La pregunta original pedía "eliminar caracteres ilegales":
public string RemoveInvalidChars(string filename)
{
return string.Concat(filename.Split(Path.GetInvalidFileNameChars()));
}
Es posible que desees reemplazarlos:
public string ReplaceInvalidChars(string filename)
{
return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));
}
Esta respuesta estaba en otro hilo de Ceres , realmente me gusta, ordenada y simple.
Pruebe algo como esto en su lugar;
string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
foreach (char c in invalid)
{
illegal = illegal.Replace(c.ToString(), "");
}
Pero tengo que estar de acuerdo con los comentarios: probablemente intentaría abordar el origen de las rutas ilegales, en lugar de intentar convertir una ruta ilegal en una legítima pero probablemente no intencionada.
Editar: O una solución potencialmente "mejor", utilizando Regex.
string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
illegal = r.Replace(illegal, "");
Aún así, surge la pregunta de por qué estás haciendo esto en primer lugar.
Utilizo Linq para limpiar nombres de archivos. También puede ampliar esto fácilmente para comprobar si hay rutas válidas.
private static string CleanFileName(string fileName)
{
return Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), string.Empty));
}
Actualizar
Algunos comentarios indican que este método no les funciona, por lo que incluí un enlace a un fragmento de DotNetFiddle para que pueda validar el método.
https://dotnetfiddle.net/nw1SWY
Puedes eliminar caracteres ilegales usando Linq de esta manera:
var invalidChars = Path.GetInvalidFileNameChars();
var invalidCharsRemoved = stringWithInvalidChars
.Where(x => !invalidChars.Contains(x))
.ToArray();
EDITAR
Así es como se ve con la edición requerida mencionada en los comentarios:
var invalidChars = Path.GetInvalidFileNameChars();
string invalidCharsRemoved = new string(stringWithInvalidChars
.Where(x => !invalidChars.Contains(x))
.ToArray());