2011-05-17 67 views
12

我想知道是否有可能获得一个只读的FileStream到一个锁定的文件? 当我尝试读取锁定的文件时,我现在得到一个异常。FileStream与锁定的文件

using (FileStream stream = new FileStream("path", FileMode.Open)) 

谢谢!

+0

您显示的行不是试图读取锁定的文件,而是您试图打开文件的位置。你是否在其他地方创建这个文件?如果存在锁定条件,您可能正在做一些事情来创建该条件。请在您列出的单行内显示更多代码。 – 2011-05-17 18:36:05

回答

27

你应该尝试另一个构造函数。他们记录在MSDN。

这一个看起来像一个赌注:

FileStream Constructor (String, FileMode, FileAccess, FileShare) 

MSDN Link

的FileAccess

,它确定如何将文件可以通过FileStream对象进行访问的常量。这获得了FileStream对象的CanRead和CanWrite属性。如果路径指定了磁盘文件,则CanSeek为true。

文件共享

,它确定如何将文件将由进程共享的常量。

+0

Awsome回答!谢谢! – 2013-04-24 20:52:07

6
using (FileStream stream = new FileStream("path", FileMode.Open)) 

将使用默认值的文件共享说法,FileShare.Read。其中拒绝写入文件的任何进程。如果另一个进程正在写入文件,那么这是行不通的,你不能否认已经获得的权利。

您必须指定FileShare.ReadWrite。如果其他进程使用了​​FileShare.None,那么这可能仍然不起作用,没有解决方法。请注意,获取正在写入的文件的读取访问是麻烦的,您没有可靠的文件结束指示。文件中的最后一条记录或行可能只是部分写入。

-1

您可以简单地解锁文件并在其后读取文件。 只需使用来自Sysinternals的Handle.exe,或使用命令行选项解锁。 他们都可以解锁文件,并且您可以轻松地从您的程序执行它们,而不用离开您的程序。 (但不要将它们用于Windows SAM文件,它不适用于SAM;)) 祝你好运!

0

我已经使用了以下工作,但应谨慎使用,因为文件可以在您被另一个进程打开时进行修改。

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.ReadWrite);