Necesito una forma sólida y simple de eliminar la ruta ilegal y los caracteres de archivo de una cadena simple. He usado el siguiente código pero no parece hacer nada, ¿qué me estoy perdiendo?
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();
}
}
}
GetInvalidFileNameChars()
eliminará cosas como: \ etc de las rutas de carpetas.Path.GetInvalidPathChars()
no parece desnudarse*
o?
Respuestas:
Pruebe algo como esto en su lugar;
Pero tengo que estar de acuerdo con los comentarios, probablemente intente tratar con la fuente de los caminos ilegales, en lugar de tratar de destrozar un camino ilegal en uno legítimo pero probablemente no intencionado.
Editar: O una solución potencialmente 'mejor', usando Regex's.
Aún así, la pregunta pide que te pregunten, ¿por qué estás haciendo esto en primer lugar?
fuente
GetInvalidPathChars()
pueda contener caracteres queGetInvalidFileNameChars()
no lo harían. No está tomando la corrección sobre la optimización "prematura". Simplemente estás usando un código incorrecto.La pregunta original pedía "eliminar caracteres ilegales":
En su lugar, puede reemplazarlos:
Esta respuesta fue en otro hilo de Ceres , realmente me gusta ordenada y simple.
fuente
Yo uso Linq para limpiar nombres de archivos. También puede extender esto fácilmente para buscar rutas válidas también.
Actualizar
Algunos comentarios indican que este método no funciona para ellos, por lo que he incluido un enlace a un fragmento de DotNetFiddle para que pueda validar el método.
https://dotnetfiddle.net/nw1SWY
fuente
var invalid = new HashSet<char>(Path.GetInvalidPathChars()); return new string(originalString.Where(s => !invalid.Contains(s)).ToArray())
. El rendimiento probablemente no sea excelente, pero eso probablemente no importe.Puede eliminar caracteres ilegales usando Linq de esta manera:
EDITAR
Así es como se ve con la edición requerida mencionada en los comentarios:
fuente
Estas son todas excelentes soluciones, pero todas dependen de ellas
Path.GetInvalidFileNameChars
, que pueden no ser tan confiables como parece. Observe la siguiente observación en la documentación de MSDN sobrePath.GetInvalidFileNameChars
:No es mejor con el
Path.GetInvalidPathChars
método. Contiene exactamente el mismo comentario.fuente
Para nombres de archivo:
Para caminos completos:
Tenga en cuenta que si tiene la intención de usar esto como una característica de seguridad, un enfoque más robusto sería expandir todas las rutas y luego verificar que la ruta proporcionada por el usuario sea realmente un elemento secundario de un directorio al que el usuario debería tener acceso.
fuente
Para empezar, Trim solo elimina caracteres del principio o del final de la cadena . En segundo lugar, debe evaluar si realmente desea eliminar los caracteres ofensivos, o fallar rápidamente y dejar que el usuario sepa que su nombre de archivo no es válido. Mi elección es la última, pero mi respuesta al menos debería mostrarle cómo hacer las cosas de la manera correcta e incorrecta:
Pregunta de StackOverflow que muestra cómo verificar si una cadena dada es un nombre de archivo válido . Tenga en cuenta que puede usar la expresión regular de esta pregunta para eliminar caracteres con un reemplazo de expresión regular (si realmente necesita hacer esto).
fuente
La mejor manera de eliminar caracteres ilegales de la entrada del usuario es reemplazar los caracteres ilegales usando la clase Regex, crear un método en el código detrás o también validar en el lado del cliente usando el control RegularExpression.
O
fuente
Yo uso expresiones regulares para lograr esto. Primero, construyo dinámicamente la expresión regular.
Luego llamo a removeInvalidChars.Replace para hacer la búsqueda y reemplazar. Obviamente, esto también se puede extender para cubrir caracteres de ruta.
fuente
new Regex(String.Format("^(CON|PRN|AUX|NUL|CLOCK\$|COM[1-9]|LPT[1-9])(?=\..|$)|(^(\.+|\s+)$)|((\.+|\s+)$)|([{0}])", Regex.Escape(new String(Path.GetInvalidFileNameChars()))), RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);
Prefiero absolutamente la idea de Jeff Yates. Funcionará perfectamente, si lo modifica ligeramente:
La mejora es solo para escapar de la expresión regular generada automáticamente.
fuente
Aquí hay un fragmento de código que debería ayudar para .NET 3 y superior.
fuente
La mayoría de las soluciones anteriores combinan caracteres ilegales para la ruta y el nombre de archivo que es incorrecto (incluso cuando ambas llamadas devuelven el mismo conjunto de caracteres). Primero dividiría la ruta + nombre de archivo en ruta y nombre de archivo, luego aplicaría el conjunto apropiado a cualquiera de ellos y luego combinaría los dos nuevamente.
wvd_vegt
fuente
Si elimina o reemplaza con un solo carácter los caracteres no válidos, puede tener colisiones:
Aquí hay un método simple para evitar esto:
El resultado:
fuente
Lanza una excepción.
fuente
Escribí este monstruo por diversión, te permite un viaje de ida y vuelta:
fuente
Creo que es mucho más fácil validar usando una expresión regular y especificar qué caracteres están permitidos, en lugar de intentar verificar todos los caracteres malos. Consulte estos enlaces: http://www.c-sharpcorner.com/UploadFile/prasad_1/RegExpPSD12062005021717AM/RegExpPSD.aspx http://www.windowsdevcenter.com/pub/a/oreilly/windows/news/csharp_0101.html
Además, haga una búsqueda de "editor de expresiones regulares", que ayudan mucho. Hay algunos que incluso generan el código en C # para usted.
fuente
Esto parece ser O (n) y no gasta demasiada memoria en cadenas:
fuente
Al examinar las respuestas aquí, todas ** parecen implicar el uso de una matriz de caracteres de caracteres de nombre de archivo no válidos.
De acuerdo, esto puede ser una micro optimización, pero para el beneficio de cualquiera que esté buscando verificar una gran cantidad de valores para ser nombres de archivo válidos, vale la pena señalar que construir un hashset de caracteres no válidos traerá un rendimiento notablemente mejor.
Me ha sorprendido (sorprendido) en el pasado lo rápido que un hashset (o diccionario) supera el iterar sobre una lista. Con cadenas, es un número ridículamente bajo (aproximadamente 5-7 elementos de la memoria). Con la mayoría de los otros datos simples (referencias de objetos, números, etc.), el crossover mágico parece ser de alrededor de 20 elementos.
Hay 40 caracteres no válidos en la "lista" de Path.InvalidFileNameChars. Hice una búsqueda hoy y hay un punto de referencia bastante bueno aquí en StackOverflow que muestra que el hashset tomará un poco más de la mitad del tiempo de una matriz / lista para 40 elementos: https://stackoverflow.com/a/10762995/949129
Aquí está la clase auxiliar que uso para desinfectar caminos. Ahora olvido por qué tenía la opción de reemplazo elegante, pero está ahí como una bonificación adicional.
Método adicional adicional "IsValidLocalPath" también :)
(** los que no usan expresiones regulares)
fuente
Puedes usar el método claramente.
fuente
Nombre de archivo no puede contener caracteres de
Path.GetInvalidPathChars()
,+
y#
símbolos, y otros nombres específicos. Combinamos todos los cheques en una clase:El método
GetValidFileName
reemplaza todos los datos incorrectos a_
.fuente
Un revestimiento para limpiar la cadena de cualquier carácter ilegal para la denominación de archivos de Windows:
fuente
fuente
Esto hará lo que quieras y evitar colisiones
fuente
Creo que la pregunta ya no está completa ... Las respuestas solo describen el nombre de archivo limpio O la ruta ... no ambas. Aquí está mi solución:
fuente
Creé un método de extensión que combina varias sugerencias:
Fuente:
fuente
Aquí hay una función que reemplaza todos los caracteres ilegales en un nombre de archivo por un carácter de reemplazo:
Por ejemplo, el guión bajo se puede usar como un carácter de reemplazo:
fuente
O simplemente puedes hacer
fuente