在我的一个项目中,我使用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例程显然可以访问该文件。
有人可以向我解释这两种方法的区别是什么?文件访问权限不应由应用程序的权限决定吗?有没有更好的方法来确定我是否对文件具有读/写访问权限?
答案 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.ReadAllBytes
,FileAccess.Read
使用FileStream
。
TLDR:您的应用需要具有写权限才能使用File.Exists
的基本构造函数。请记住,有一个{{1}}方法用于此目的。打开和关闭文件以查看它是否存在不是正确的方法。
答案 1 :(得分:1)
使用IO.File.Exist()例程检查文件是否存在。您无需阅读文件内容。