Запись файла с именем устройства - PullRequest
9 голосов
/ 21 марта 2011

Я столкнулся с чем-то любопытным.У меня есть декомпилятор, который извлекает информацию из двоичного файла.Я извлекаю серию объектов, которые мне нужно записать отдельно на диск в виде двоичных файлов.Эти объекты являются графическими моделями, скомпилированными в библиотеку.Объекты имеют встроенные имена, и мне нужно использовать это имя в качестве имени файла.

Я использую:

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

Я понимаю, что обработка исключений невелика!Однако проблема обнаружилась, когда один из сохраняемых объектов имел имя COM2. Это вызвало исключение:

FileStream не будет открывать устройства Win32, такие как дисковые разделы и ленточные накопители.

Так что в моем примере я пытаюсь написать файл с именем COM2.mdl и получить эту ошибку.Я действительно не хочу менять эти имена, так как они встроены разработчиком.

Я рассматривал возможность проверки имен по списку устройств, которые могут вызвать ошибку - но я действительно не знаю, чтоэтот список может быть, а также это будет означать изменение имени файла, который я не хочу делать.

Итак, мой вопрос: есть ли способ записать байтовый массив в виде двоичного файла, кроме как сFileStream, который может решить эту проблему?

Большое спасибо

Ответы [ 2 ]

15 голосов
/ 21 марта 2011

Зарезервированные имена: AUX, CLOCK$, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, CON, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, NUL and PRN.

Вы не сможете создавать файлы с этими именами (и с любым расширением, например, COM2.txt в Windows в любой файловой системе - это принудительно применяется ядром Windows, для обратной совместимости с CP / M . Это МОЖЕТ быть ограничением для файловых систем FAT, но не для NTFS. См. Википедию для получения дополнительной информации.

Однако вы можете попробовать использовать UNC File Names, они должны работать:

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

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

Я не уверен на 100%, работают ли пути UNC с File Stream, но, безусловно, есть способ использовать их в .net.

0 голосов
/ 21 марта 2011

Оберните вызов «new FileStream» блоком try / catch, чтобы специально перехватить System.ArgumentException. Если вы поймете это, предположите, что имя файла неверно, и попробуйте еще раз с другим именем файла (например, добавьте «foo» к строке имени файла).

Также вы можете использовать System.IO.Path.GetInvalidPathChars () и System.IO.Path.GetInvalidFileNameChars (); чтобы получить полный список «недопустимых символов», которые не помещаются в имени файла Windows. Таким образом, вы можете удалить или заменить эти символы из строки имени файла перед попыткой создания файла.

...