我正在编写一个C#应用程序来读取另一个应用程序保持打开的文件。正如你们中的一些人可能猜到的,我得到的只是IOExceptions,因为“该文件正被另一个进程使用”。我试过调整一下File.Open();这是我目前的尝试:
FileStream fsIn = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
(我知道FileShare标志对 之后访问该文件的其他进程更有意义,但我还是试过它。)
令我困惑的是Notepad.exe会打开文件就好了。在我深入了解Filemon以获取更多线索之前,您是否知道如何以记事本的方式打开文件?感谢。
答案 0 :(得分:5)
你几乎拥有它。你真的想要FileShare.ReadWrite
:
FileStream fsIn = File.Open(fileName,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite);
FileShare.Read
禁止其他进程写入该文件。 FileShare.ReadWrite
允许这样做。
写入允许后续打开 写作文件。如果这个标志是 未指定,任何要求打开 写作文件(通过这个过程或 另一个过程)将失败,直到 文件已关闭。但是,即使这样 指定了标志,附加 可能仍需要权限 访问该文件。
ReadWrite 允许 随后打开文件 阅读或写作。如果这个标志是 未指定,任何要求打开 用于阅读或写作的文件(由此 过程或其他过程)将失败 直到文件关闭。然而, 即使指定了这个标志, 其他权限可能仍然是 需要访问该文件。
它也向我退了。
答案 1 :(得分:3)
好吧,如果您正在处理小文件,请使用
string myFileContents = System.IO.File.ReadAllText(@"c:\daniellesteele.txt");
表示文字或
byte[] myfileContents = System.IO.File.ReadAllBytes(@"c:\aleagueoftheirmoan.mpg");
表示二进制文件。
答案 2 :(得分:1)
您确定在其他进程打开后,记事本是否可以打开文件?如果共享被授予,它看起来取决于谁最初拥有该文件。请参阅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);
当然我不是操作系统专家,所以这可能是完全错误的。
答案 3 :(得分:0)
有了这个
FileStream fsIn = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
您允许其他程序修改该文件,同时在您的程序中打开它。 因此,如果您打开该文件,则不会执行IOException“该文件正由另一个进程使用”。
答案 4 :(得分:-2)
尝试:
FileStream file = new FileStream(filename, FileMode.Open);