Вопрос:

Запись файла с именем устройства

c# filestream

3476 просмотра

2 ответа

1813 Репутация автора

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

Я использую :

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, который может решить эту проблему?

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

Автор: ScruffyDuck Источник Размещён: 21.03.2011 07:18

Ответы (2)


0 плюса

62158 Репутация автора

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

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

Автор: selbie Размещён: 21.03.2011 07:36

15 плюса

122132 Репутация автора

Решение

Зарезервированные имена 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.

Автор: Michael Stum Размещён: 21.03.2011 08:11
Вопросы из категории :
32x32