2010-09-29 30 views
15

Tengo datos procedentes de un campo nvarchar de la base de datos del servidor SQL a través de EF3.5. Esta cadena se utiliza para crear un nombre de archivo y necesita eliminar los caracteres no válidos e intentó seguir las opciones, pero ninguno de ellos funciona. Por favor, sugiera por qué este es un misterio tan comprensible? ¿Estoy haciendo algo mal?C# Eliminar caracteres no válidos del nombre de archivo

Revisé casi todas las preguntas relacionadas en este sitio ... y ahora publico una pregunta consolidada de todas las sugerencias/respuestas de otras preguntas similares.

UPD: El problema no estaba relacionado ... Todas estas opciones funcionan. Entonces publicarlo en wiki de la comunidad.

public static string CleanFileName1(string filename) 
{    
    string file = filename;            
    file = string.Concat(file.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries)); 

    if (file.Length > 250) 
    { 
     file = file.Substring(0, 250); 
    } 
    return file; 
} 

public static string CleanFileName2(string filename) 
{ 
    var builder = new StringBuilder(); 
    var invalid = System.IO.Path.GetInvalidFileNameChars(); 
    foreach (var cur in filename) 
    { 
     if (!invalid.Contains(cur)) 
     { 
      builder.Append(cur); 
     } 
    } 
    return builder.ToString(); 
} 

public static string CleanFileName3(string filename) 
{          
    string regexSearch = string.Format("{0}{1}", 
     new string(System.IO.Path.GetInvalidFileNameChars()), 
     new string(System.IO.Path.GetInvalidPathChars())); 
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); 
    string file = r.Replace(filename, ""); 

    return file; 
}  

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

public static string CleanFileName5(string filename) 
{    
    string file = filename; 

    foreach (char c in System.IO.Path.GetInvalidFileNameChars()) 
    { 
     file = file.Replace(c, '_'); 
    }         
    return file; 
} 
+1

¿Qué quiere decir por "ninguno de ellos funciona"? – RedFilter

+0

la cadena devuelta todavía contiene caracteres inválidos ... no se eliminaron caracteres inválidos devueltos por System.IO.Path.GetInvalidFileNameChars(). – Bhuvan

+0

Esto se explica mejor si nos muestra un ejemplo de entrada que no funciona. –

Respuesta

3

no hay caracteres no válidos devueltos por System.IO.Path.GetInvalidFileNameChars() que se quita. - Bhuvan hace 5 minutos

El primer método informados funciona bien para los personajes en Path.GetInvalidFileNameChars(), aquí está en el trabajo:

static void Main(string[] args) 
{ 
    string input = "abc<def>ghi\\1234/5678|?9:*0"; 

    string output = CleanFileName1(input); 

    Console.WriteLine(output); // this prints: abcdefghi1234567890 

    Console.Read(); 
} 

supongo pesar de que su problema es con algunos de los lenguajes especializados específica caracteres. Usted puede tratar de solucionar este problema mediante la impresión de los códigos ASCII de los caracteres en la cadena:

string stringFromDatabase = "/5678|?9:*0"; // here you get it from the database 

foreach (char c in stringFromDatabase.ToCharArray()) 
    Console.WriteLine((int)c); 

y consultando la tabla ASCII: http://www.asciitable.com/

I nuevo sospechoso que se ven con caracteres códigos de más de 128, y debe excluirlos de su cadena.

+0

Esto funciona para cadenas normales como esa, pero no la cadena proviene de un campo nvarchar de la base de datos. – Bhuvan

+0

¿Puedes copiar y pegar la cadena que estás recibiendo de tu base de datos como comentario? –

+0

"fbo test investor 12/30/92" En esta cadena estoy tratando de eliminar el/y no los elimina. Pero cuando intento lo mismo ... desde la ventana inmediata ... pegando solo una cuerda. Elimina esos char. – Bhuvan

4

probar este

filename = Regex.Replace(filename, "[\/?:*""><|]+", "", RegexOptions.Compiled)

+0

@DJ .. El mismo problema con esto también ... funciona para cadenas normales pero no para las cadenas que provienen de nvarchar campo de la base de datos – Bhuvan

+0

'filename = Regex.Replace (filename, @" [\ /?: ​​* ""><|] + "," ", RegexOptions.Compiled);' –

27

Aquí es una función que utilizo en una clase común estática:

public static string RemoveInvalidFilePathCharacters(string filename, string replaceChar) 
{ 
    string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); 
    Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); 
    return r.Replace(filename, replaceChar); 
} 
Cuestiones relacionadas