编写具有设备名称的文件

Scr*_*uck 9 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;
        }
Run Code Online (Sandbox Code Playgroud)

我意识到我的异常处理并不好!但是,当其中一个要保存的对象名为COM2时,问题就出现了.这导致异常:

FileStream不会打开Win32设备,如磁盘分区和磁带驱动器.

所以在我的例子中,我试图编写一个名为COM2.mdl的文件并得到此错误.我真的不想更改这些名称,因为它们是由开发人员嵌入的.

我考虑根据可能导致错误的设备列表测试名称 - 但我真的不知道该列表可能是什么,也意味着更改我不想做的文件的名称.

所以我的问题是:有没有办法将字节数组写为二进制文件而不是FileStream可能会解决这个问题?

非常感谢

Mic*_*tum 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.

您将无法创建具有这些名称的文件(以及任何扩展名,例如COM2.txt在任何文件系统的Windows上 - 这是Windows内核强制执行的东西,以便与CP/M向后兼容.它可能是对FAT文件系统的限制,但它不在NTFS上.有关更多信息,请参阅Wikipedia.

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

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

echo test > \\mypc\c$\Users\Michael\Desktop\com2.txt
-> works flawlessly
Run Code Online (Sandbox Code Playgroud)

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

  • +1很棒的信息.我无法弄清楚为什么我无法创建一个名为con.txt的文件. (2认同)