FileStream和System.IO.File方法之间的文件访问差异

时间:2014-02-04 09:49:32

标签: c# .net vb.net file-io filestream

在我的一个项目中,我使用System.Environment.SpecialFolder.CommonApplicationData文件夹中的路径(在我的情况下为C:\ ProgramData)来存储配置和注册数据。但是我遇到了问题。我检查是否可以使用例程

访问文件
Dim isok As Boolean = True
Try
   Dim ftry As New IO.FileStream(frmMain.APPDATA & "\regid.bin", FileMode.Open)
   ftry.Close()
Catch ex As Exception
  isok = False
End Try

APPDATA是我的配置文件夹的路径,我在此之前检查文件是否确实存在(确实如此)。在一台机器上,这个例程对我来说是假的。例外说没有文件访问权限。 如果我重写这个例程:

Dim isok As Boolean = True
Try
   Dim contents() as Byte = IO.File.ReadAllBytes(frmMain.APPDATA & "\regid.bin")
Catch ex As Exception
  isok = False
End Try

它返回true,因此IO例程显然可以访问该文件。

有人可以向我解释这两种方法的区别是什么?文件访问权限不应由应用程序的权限决定吗?有没有更好的方法来确定我是否对文件具有读/写访问权限?

2 个答案:

答案 0 :(得分:4)

FileStream构造函数传递给另一个构造函数重载..即这一个:

internal FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options, string msgPath, bool bFromProxy, bool useLongPath, bool checkHost)

默认情况下,FileAccess传递的是FileAccess.ReadWrite File.ReadAllBytes。如果您的应用程序没有写入权限,则可能会失败。

另一方面,using (var fileStream = new FileStream(..., ..., FileAccess.Read, ... // ^^^^ this 执行此操作:

File.ReadAllBytes

注意FileAccess.Read使用FileStream.ctor值。

这就是差异。 FileAccess.ReadWrite使用File.ReadAllBytesFileAccess.Read使用FileStream

TLDR:您的应用需要具有写权限才能使用File.Exists的基本构造函数。请记住,有一个{{1}}方法用于此目的。打开和关闭文件以查看它是否存在不是正确的方法。

答案 1 :(得分:1)

使用IO.File.Exist()例程检查文件是否存在。您无需阅读文件内容。