编写具有设备名称的文件

时间:2011-03-21 07:18:22

标签: c# filestream

我遇到了好奇的事。我有一个反编译器从二进制文件中提取信息。我正在提取一系列对象,我需要将它们作为二进制文件单独写入磁盘。这些对象是编译到库中的图形模型。对象中嵌入了名称,我需要使用该名称作为文件名。

我正在使用:

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 个答案:

答案 0 :(得分:15)

保留名称为AUX, CLOCK$, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, CON, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, NUL and PRN

对于backwards compatibility with CP/M,您将无法使用这些名称(以及任何扩展名,例如COM2.txt在Windows上的任何文件系统上创建文件 - 这是Windows内核强制执行的操作。虽然是对FAT文件系统的限制,但它不是在NTFS上。See Wikipedia以获取更多信息。

但是,您可以尝试使用UNC文件名,这些应该起作用:

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

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

我不是100%确定UNC路径是否与文件流一起使用,但肯定有办法在.net中使用它们。

答案 1 :(得分:0)

使用try / catch块将调用包装到“new FileStream”以专门捕获System.ArgumentException。如果你发现这一点,假设文件名无效并再次尝试使用不同的文件名(例如,将“foo”添加到文件名字符串中)。

此外,您可以使用System.IO.Path.GetInvalidPathChars()和System.IO.Path.GetInvalidFileNameChars();获取不适合Windows文件名的“无效字符”的完整列表。因此,在尝试创建文件之前,您可以从文件名字符串中删除或替换这些字符。