2011-03-21 22 views
9

Natknąłem się na coś ciekawego. Mam dekompilator, który wyodrębnia informacje z pliku binarnego. Wyodrębniam serię obiektów, które muszę zapisać osobno na dysku jako pliki binarne. Te obiekty to modele graficzne skompilowane do biblioteki. Obiekty mają osadzone w nich nazwy i muszę użyć tej nazwy jako nazwy pliku.Zapisywanie pliku z nazwą urządzenia

Używam:

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

Zdaję sobie sprawę, mój obsługa wyjątków nie jest wielki! Jednak problem pojawił się, gdy jeden z obiektów do zapisania miał nazwę COM2. Wywołał to wyjątek:

FileStream nie otworzy urządzeń Win32, takich jak partycje dysków i napędy taśm.

Tak więc w moim przykładzie próbuję napisać plik o nazwie COM2.mdl i uzyskać ten błąd. Naprawdę nie chcę zmieniać tych nazw, ponieważ są one osadzone przez programistę.

Rozważałem przetestowanie nazw na liście urządzeń, które mogą powodować błąd - ale tak naprawdę nie wiem, co to może być lista, a także oznaczałoby to zmianę nazwy pliku, którego nie chcę zrobić.

Moje pytanie: czy istnieje sposób na zapisanie tablicy bajtów jako pliku binarnego innego niż plik FileStream, który może zostać usunięty z tego problemu?

Dziękujemy

Odpowiedz

15

Zarezerwowane nazwy to AUX, CLOCK$, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, CON, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, NUL and PRN.

Nie będzie można tworzyć plików o tych nazwach (oraz z dowolnym rozszerzeniem, np. COM2.txt w systemie Windows w dowolnym systemie plików - jest to wymuszone jądro systemu Windows, dla backwards compatibility with CP/M. MOŻE to jednak być ograniczenie systemów plików FAT , ale to nie na NTFS See Wikipedia jakiegoś więcej informacji

można jednak spróbować użyć UNC nazwy plików, które powinny pracować..

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

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

nie jestem w 100% pewien, czy ścieżki UNC pracować ze Strumieniem plików, ale na pewno jest sposób na ich użycie w .net.

+1

Próbowałem dodać \\? \ Na początku nazwy pliku dla FileStream i zwróciłem Nielegalny znak w wyjątku ścieżki, więc domyślam się, że ścieżki UNC i FileStream nie mieszają się – ScruffyDuck

+0

Dzięki za listę zarezerwowanych słów. W końcu zdecydowałem się przetestować na tej liście i jeśli jest tam nazwa, aby zmienić nazwę, dodając sufiks. To działa wystarczająco dobrze dla mojego celu od teraz. – ScruffyDuck

+2

+1 Świetne informacje. Nie mogłem się domyślić, dlaczego nie mogłem stworzyć pliku o nazwie con.txt. –

0

Wrap wezwanie do "new FileStream" z bloku try/catch specjalnie złapać System.ArgumentException. Jeśli złapiesz to, załóżmy, że nazwa pliku jest nieprawidłowa i spróbuj ponownie z inną nazwą pliku (np. Prześlij "foo" do ciągu nazwy pliku).

Można również użyć System.IO.Path.GetInvalidPathChars() i System.IO.Path.GetInvalidFileNameChars(); aby uzyskać pełną listę "nieprawidłowych znaków", które nie mieszczą się w nazwie pliku Windows. Możesz więc usunąć lub zastąpić te znaki z ciągu nazwy pliku przed próbą utworzenia pliku.