¿Cómo eliminar caracteres ilegales de rutas y nombres de archivos?

Resuelto Gary Willoughby asked hace 16 años • 30 respuestas

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();
        }
    }
}
Gary Willoughby avatar Sep 28 '08 22:09 Gary Willoughby
Aceptado

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.

Shehab Fawzy avatar Apr 20 '2014 13:04 Shehab Fawzy

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.

Matthew Scharley avatar Sep 28 '2008 16:09 Matthew Scharley

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

Michael Minton avatar Sep 12 '2011 20:09 Michael Minton

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());
Gregor Slavec avatar Nov 24 '2010 19:11 Gregor Slavec