System.IO.File.OpenRead正在运行,但System.IO.FileStream不工作?

时间:2014-12-10 09:26:53

标签: c# .net

在我的应用程序中,我正在阅读.PDF文件,使用System.IO.FileStream(filePath)。当文件夹具有本地用户权限时,这工作正常。当我从文件夹中删除本地用户时,这会给出访问被拒绝错误。 我使用这段代码......

System.IO.FileStream objFStream = new System.IO.FileStream(strPath, System.IO.FileMode.Open);
        byte[] bytRead = new byte[(int)objFStream.Length];
        objFStream.Read(bytRead, 0, (int)objFStream.Length);
        objFStream.Close();
        objFStream.Dispose();

一旦我将System.IO.FileStream替换为System.IO.File.OpenRead(strPath),它就可以了。 替换代码是......

System.IO.FileStream objFStream = System.IO.File.OpenRead(strPath);
            byte[] bytRead = new byte[(int)objFStream.Length];
            objFStream.Read(bytRead, 0, (int)objFStream.Length);
            objFStream.Close();
            objFStream.Dispose();

我想知道这有什么不同? 如果有人知道请帮忙。

2 个答案:

答案 0 :(得分:2)

File.OpenRead方法在打开文件时使用FileAccess.Read。区别于:

return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);

documentation说明了您正在使用的构造函数:

  

对于没有FileAccess参数的构造函数,如果mode参数设置为Append,则Write是默认访问权限。否则,访问权限设置为ReadWrite

所以我猜你没有权限写这个文件。这就是它抛出异常的原因。您可以尝试使用ReadWrite访问权限打开流来验证这一点:

new FileStream(strPath, FileMode.Open, FileAccess.ReadWrite);

答案 1 :(得分:1)

  ... new System.IO.FileStream(strPath, System.IO.FileMode.Open)

当你只说“我想打开文件”时,.NET不知道你是否要读取或写入文件。所以它猜测两者都是安全的,FileAccess.ReadWrite。但是,文件系统目录通常只允许用户读取文件并禁止写入。任何机器上的标准示例是c:\ windows和c:\ program files目录及其子目录。所以这个例外并不出乎意料。

您必须明确表达您对该文件的意图。就像File.OpenRead()隐含的只是它的名字。您必须添加FileAccess.Read参数。


轶事:File类很晚才被添加到框架中。受微软进行框架可用性研究的启发。他们询问有经验的程序员,他们从未见过.NET使用FileStream编写示例程序。没有人做对了。