2009-06-20 21 views
7

estoy permitiendo al usuario elegir cualquier nombre de usuario que quiere y que puede ser cualquier cosa, comoFilesystem filename escape? C#

AC♀¿!$"Man'@ 

Ahora tengo que crear un directorio para él. ¿Qué función utilizo para escapar del texto, entonces no hago un problema/excepción de FS?

Respuesta

3

Use Path.GetInvalidFileNameChars o Path.GetInvalidPathChars para comprobar la eliminación de los caracteres.

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx

+0

Y asegúrese de verificar si el directorio ya existe (verifique si hay "nombres de usuario" duplicados). – schnaader

+1

Esto no ayuda. Necesito un escape sin pérdida, la eliminación de caracteres es con pérdida y puede causar colisión después de que dos nombres diferentes tengan caracteres eliminados –

+4

También tenga en cuenta que mientras GetInvalidPathChars() devuelve caracteres que no son válidos, no devuelve necesariamente TODOS los caracteres que no son válidos. Cita: "No se garantiza que el conjunto devuelto por este método contenga el conjunto completo de caracteres que no son válidos en los nombres de archivos y directorios". – Bevan

1

creo que la mejor opción sería la creación de un diccionario que asigna caracteres no válidos del sistema de archivos a una cadena de reemplazo válida. Luego escanee la cadena en busca de caracteres no válidos, reemplazando con cadenas válidas sobre la marcha. Esto le permitiría al usuario elegir lo que quiera y le dará la consistencia para traducirlo nuevamente al nombre del usuario si lo desea.

+0

Pero tenga en cuenta que debe poder decir qué caracteres se reemplazaron después. Convertir $ User a DollarUser no ayudará. – schnaader

+0

Es cierto, pero podría crear una secuencia de caracteres que un usuario no podría usar.Al igual que en C#, cuando el compilador emite código para ciertas cosas. – jasonh

0

¿necesita el usuario saber el nombre exacto de su directorio? Si no, ¿por qué no crear directorios utilizando reglas arbitrarias y asociar cada una a su propietario en un DB o algo así?

+0

Eso funcionaría, siempre podría usar el ID de usuario en lugar del nombre. Solo quiero el nombre bc, es más legible para los administradores aunque quizás sea inútil. –

5

Dependiendo de si sus caracteres son ASCII/Unicode, puede usar los valores de byte/caracteres como reemplazo y usar algún carácter para marcar estos caracteres reemplazados (como un guión bajo), que le da algo como _001_255_200ValidPart_095_253. Tenga en cuenta que también debe reemplazar los caracteres de marcado (_095 en el ejemplo, 95 es el código ASCII para el guión bajo).

+0

Sí, pero elegir un esquema de codificación es trivial. Lo difícil es saber a qué personajes escapar. –

+0

Aunque escapar demasiados personajes no va a doler aquí, así que puedes, por ejemplo, solo use A-Z, a-z, 0-9 como válidos – schnaader

10

Ya sea que reemplace caracteres no válidos o los elimine, siempre existirá la posibilidad de colisiones. Si yo fuera usted, tendría una clave primaria separada para el usuario (un GUID tal vez) y la usaría para el nombre del directorio. De esta forma, puede tener sus nombres de usuario como desee sin preocuparse por los nombres de directorio no válidos.

+3

¿Por qué el usuario anónimo, downvote? Sigo creyendo que esta es una mejor solución. De lo contrario, Bobby y Bobby obtendrían el mismo directorio y eso provocaría un conflicto. – Jacob

+0

La pregunta era para una estrategia de escape de texto compatible con las reglas de nombre de archivo. Evitar escaparse por completo creando y manteniendo una estructura de datos separada puede ser una solución para el problema, pero no responde la pregunta. –

+2

Meh, creo que la gente va principalmente a Stack Overflow para encontrar soluciones a sus problemas, no solo las respuestas a sus preguntas. Si alguien hace la pregunta incorrecta, como "cómo analizar este HTML con una expresión regular", es mejor señalar los defectos en el enfoque. – Jacob

1

No encontrará una forma de escapar del nombre de usuario que dará un nombre válido de directorio que no se clasifique en cada instancia.

Un enfoque más confiable será crear el directorio utilizando alguna convención arbitraria, y luego almacenar un mapeo entre los dos. Esto también brinda soporte para el caso en que su usuario desee cambiar de nombre.

Consulte la pregunta # 663520 para obtener más información al respecto.

Cuestiones relacionadas