2011-03-21 50 views
9

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

我使用:

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其他二进制文件可能会在这个问题上的方法吗?

非常感谢

回答

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内核执行的事情,为backwards compatibility with CP/M它可以在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

我尝试添加\\?\在文件名的FileStream的开始和它返回的路径名例外非法字符,所以我想这UNC路径和的FileStream不保留字列表混合 – ScruffyDuck 2011-03-21 09:09:20

+0

感谢。最后,我决定对这个列表进行测试,如果名称是通过添加后缀来改变名称的话。这对我目前的目标来说已经足够了。 – ScruffyDuck 2011-03-21 09:24:54

+2

+1非常好的信息。我无法弄清楚为什么我不能创建一个名为con.txt的文件。 – 2013-05-20 20:24:20

0

裹在调用 “新的FileStream” 用try/catch块,以专门捕获System.ArgumentException。如果你想知道这个,假定文件名是无效的,然后用不同的文件名重试(例如在文件名字符串前面加上“foo”)。

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

相关问题