2011-03-21 7 views
9

Ho incontrato qualcosa di curioso. Ho un decompilatore che estrae le informazioni da un file binario. Sto estraendo una serie di oggetti che ho bisogno di scrivere separatamente su disco come file binari. Questi oggetti sono modelli grafici compilati in una libreria. Gli oggetti hanno nomi incorporati in essi e ho bisogno di usare quel nome come nome del file.Scrittura di un file con il nome di un dispositivo

sto 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; 
     } 

mi rendo conto la mia gestione delle eccezioni non è grande! Tuttavia il problema si presentava quando uno degli oggetti da salvare aveva il nome COM2 Ciò provocava un'eccezione:

FileStream non apre i dispositivi Win32 come le partizioni del disco e le unità nastro.

Quindi nel mio esempio sto cercando di scrivere un file chiamato COM2.mdl e ottenere questo errore. Non voglio davvero dover cambiare questi nomi poiché sono incorporati dallo sviluppatore.

Ho considerato di testare i nomi in base a un elenco di dispositivi che potrebbero causare l'errore, ma non so davvero quale potrebbe essere l'elenco e significherebbe anche cambiare il nome del file che non desidero fare.

Quindi la mia domanda: esiste un modo per scrivere un array di byte come file binario diverso da FileStream che potrebbe superare questo problema?

Molte grazie

risposta

15

I nomi riservati sono AUX, CLOCK$, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, CON, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, NUL and PRN.

Non è possibile creare file con questi nomi (e con qualsiasi estensione, ad esempio COM2.txt su Windows su qualsiasi file system, vale a dire un kernel di Windows, per backwards compatibility with CP/M. Potrebbe essere una limitazione sui file system FAT , ma non è su NTFS See Wikipedia per un po 'di informazioni

Tuttavia, si può provare a utilizzare i nomi UNC di file, questi dovrebbero lavorare:..

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

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

io non sono sicuro al 100% se percorsi UNC funziona con File Stream, ma c'è sicuramente un modo per usarli in .net.

+1

Ho provato ad aggiungere \\? \ All'inizio del nome file per FileStream e ha restituito un carattere non valido nell'eccezione del percorso, quindi suppongo che percorsi UNC e FileStream non si combinino – ScruffyDuck

+0

Grazie per l'elenco di parole riservate. Alla fine ho deciso di testare contro questa lista e se il nome è lì per cambiare il nome aggiungendo un suffisso. Funziona abbastanza bene per il mio scopo sin d'ora. – ScruffyDuck

+2

+1 Grandi informazioni. Non riuscivo a capire perché non potevo creare un file chiamato con.txt. –

0

Avvolgere la chiamata alla "nuova FileStream" con un blocco try/catch per catturare specificamente System.ArgumentException. Se si cattura questo, si supponga che il nome file non sia valido e riprova con un nome file diverso (ad esempio, anteporre "foo" alla stringa nomefile).

Inoltre, è possibile utilizzare System.IO.Path.GetInvalidPathChars() e System.IO.Path.GetInvalidFileNameChars(); per ottenere l'elenco completo di "caratteri non validi" che non rientrano in un nome file di Windows. Quindi puoi rimuovere o sostituire quei caratteri dalla stringa del nome file prima di tentare di creare il file.