【问题标题】:Which flags to open a file the way Notepad.exe does?以 Notepad.exe 的方式打开文件的标志有哪些?
【发布时间】:2009-07-16 21:47:08
【问题描述】:

我正在编写一个 C# 应用程序来读取另一个应用程序保持打开的文件。正如你们中的一些人可能猜到的,我得到的只是 IOExceptions,因为“该文件正在被另一个进程使用”。我试着稍微调整一下 File.Open();这是我目前的尝试:

FileStream fsIn = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

(我知道 FileShare 标志对于之后访问该文件的其他进程更有意义,但无论如何我已经尝试过。)

令我困惑的是,Notepad.exe 会很好地打开文件。在我深入研究 Filemon 以获取更多线索之前,你们中有人知道如何像记事本那样打开文件吗?谢谢。

【问题讨论】:

    标签: c# file-io


    【解决方案1】:

    你几乎拥有它。你其实想要FileShare.ReadWrite

    FileStream fsIn = File.Open(fileName,
                                FileMode.Open,
                                FileAccess.Read,
                                FileShare.ReadWrite);
    

    FileShare.Read 不允许其他进程写入该文件。 FileShare.ReadWrite 允许这样做。

    Write 允许随后打开 用于写入的文件。如果这个标志是 未指定,任何请求打开 用于写入的文件(通过此过程或 另一个进程)将失败,直到 文件已关闭。然而,即使这 指定标志,附加 可能仍需要权限 访问文件。

    ReadWrite 允许 随后打开文件 阅读或写作。如果这个标志是 未指定,任何请求打开 用于读取或写入的文件(由此 进程或另一个进程)将失败 直到文件关闭。然而, 即使指定了这个标志, 额外的权限可能仍然是 需要访问该文件。

    对我来说也是倒退。

    【讨论】:

      【解决方案2】:

      好吧,如果您正在处理小文件,请使用

      string myFileContents = System.IO.File.ReadAllText(@"c:\daniellesteele.txt");
      

      文本或

      byte[] myfileContents = System.IO.File.ReadAllBytes(@"c:\aleagueoftheirmoan.mpg");
      

      对于二进制文件。

      【讨论】:

      • 很想给 mpg +1 :P
      • 感谢您的提示,但这种文件一开始很小,但可能很快就会变大!
      • 是的,那么这不是您的选择。只是把它扔在那里以获得一般信息。我爱我一些 ReadAllText()。你们是对的。这个答案绝对不值得+1。 :P
      【解决方案3】:

      您确定记事本可以在 其他进程打开文件后打开它吗?如果允许共享,似乎取决于谁最初拥有该文件。请参阅MSDN 中的以下示例:

      The following FileStream constructor opens an existing file and grants read-only access to other users (FileShare.Read).
      
      [C#] 
      FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
      

      当然,我不是操作系统专家,所以这可能是完全错误的。

      【讨论】:

        【解决方案4】:

        有了这个

        FileStream fsIn = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        

        您允许其他程序修改该文件,而该文件在您的程序中打开。 所以,如果你打开文件,IOException“文件正在被另一个进程使用”不会被执行。

        【讨论】:

          【解决方案5】:

          试试:

          FileStream file = new FileStream(filename, FileMode.Open);
          

          【讨论】:

          • 不幸的是,它并没有表现得更好!还是谢谢。
          猜你喜欢
          • 2013-12-31
          • 1970-01-01
          • 2010-10-25
          • 2019-12-05
          • 1970-01-01
          • 2010-10-11
          • 2010-12-10
          • 2022-01-22
          • 1970-01-01
          相关资源
          最近更新 更多