2011-03-21 12 views
9

Me he topado con algo curioso. Tengo un descompilador que extrae información de un archivo binario. Estoy extrayendo una serie de objetos que necesito escribir por separado en el disco como archivos binarios. Estos objetos son modelos gráficos compilados en una biblioteca. Los objetos tienen nombres incrustados en ellos y necesito usar ese nombre como el nombre del archivo.Escribiendo un archivo que tiene el nombre de un dispositivo

estoy usando:

try { 
      // Open file for reading . 
      using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { 
       // Writes a block of bytes to this stream using data from a byte array. . 
       fileStream.Write(byteArray, 0, byteArray.Length); 
       // close file stream . 
       fileStream.Close(); 
      } 
      return true; 
     } 

     catch (Exception exception) { 
      return false; 
     } 

realizo mis manejo de excepciones no es muy grande! Sin embargo, el problema apareció cuando uno de los objetos para guardar tenía el nombre COM2 Esto provocó una excepción:

FileStream no abrirá los dispositivos Win32 como las particiones de disco y las unidades de cinta.

Por lo tanto, en mi ejemplo, intento escribir un archivo llamado COM2.mdl y obtener este error. Realmente no quiero tener que cambiar estos nombres ya que están integrados por el desarrollador.

Consideré probar los nombres en una lista de dispositivos que pueden causar el error, pero realmente no sé cuál podría ser esa lista y también significaría cambiar el nombre del archivo que no quiero hacer.

Así que mi pregunta: ¿Hay alguna manera de escribir una matriz de bytes como un archivo binario distinto de FileStream que podría superar este problema?

Muchas gracias

Respuesta

15

Los nombres reservados son AUX, CLOCK$, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, CON, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, NUL and PRN.

Usted no será capaz de crear archivos con estos nombres (y con cualquier extensión, por ejemplo COM2.txt en Windows en cualquier sistema de archivos -. Eso es un núcleo de Windows cumplir cosa, por backwards compatibility with CP/M Puede ser una limitación en sistemas de archivos FAT, aunque , pero no es en NTFS See Wikipedia de algo más de información

sin embargo, se puede tratar de utilizar UNC nombres de archivo, éstos deben trabajar:..

echo test > com2.txt 
-> The system cannot find the file specified. 

echo test > \\mypc\c$\Users\Michael\Desktop\com2.txt 
-> works flawlessly 

no estoy 100% seguro de si rutas UNC trabajar con File Stream, pero ciertamente hay una manera de usarlos en .net.

+1

Intenté agregar \\? \ Al comienzo del nombre del archivo para FileStream y devolvió un carácter ilegal en la excepción del nombre de ruta así que supongo que las rutas UNC y FileStream no se mezclan – ScruffyDuck

+0

Gracias por la lista de palabras reservadas. Al final, decidí probar contra esta lista y si el nombre está allí para cambiar el nombre agregando un sufijo. Eso funciona bastante bien para mi propósito a partir de ahora. – ScruffyDuck

+2

+1 Excelente información. No pude entender por qué no pude crear un archivo llamado con.txt. –

0

Wrap la llamada a la "nueva FileStream" con un bloque try/catch para detectar específicamente System.ArgumentException. Si detecta esto, suponga que el nombre de archivo no es válido y vuelva a intentarlo con un nombre de archivo diferente (por ejemplo, anteponga "foo" a la cadena de nombre de archivo).

Además, puede usar System.IO.Path.GetInvalidPathChars() y System.IO.Path.GetInvalidFileNameChars(); para obtener la lista completa de "caracteres inválidos" que no cabrán dentro de un nombre de archivo de Windows. Así que puede quitar o reemplazar esos caracteres de la cadena de nombre de archivo antes de intentar crear el archivo.

Cuestiones relacionadas