【问题标题】:Writing a File that has the Name of a Device编写具有设备名称的文件
【发布时间】:2011-03-21 07:18:21
【问题描述】:

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

我正在使用:

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 之外,还有其他方法可以将字节数组写入二进制文件吗?

非常感谢

【问题讨论】:

    标签: c# filestream


    【解决方案1】:

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

    您将无法使用这些名称创建文件(以及任何扩展名,例如在任何文件系统上的 Windows 上的 COM2.txt - 这是 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 中使用它们。

    【讨论】:

    • 我尝试在 FileStream 的文件名开头添加 \\?\ 并在路径名异常中返回非法字符,所以我猜 UNC 路径和 FileStream 不混合
    • 感谢保留字列表。最后,我决定针对这个列表进行测试,如果名称存在,则通过添加后缀来更改名称。到目前为止,这对我的目的来说已经足够了。
    • +1 很棒的信息。我不明白为什么我不能创建一个名为 con.txt 的文件。
    【解决方案2】:

    使用 try/catch 块包装对“new FileStream”的调用,以专门捕获 System.ArgumentException。如果您发现此问题,请假设文件名无效并使用不同的文件名重试(例如,在文件名字符串前加上“foo”)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2012-03-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多