Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileStream和System.IO.File方法之间的文件访问差异_C#_.net_Vb.net_File Io_Filestream - Fatal编程技术网

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

C# FileStream和System.IO.File方法之间的文件访问差异,c#,.net,vb.net,file-io,filestream,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)

在我的一个项目中,我使用
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是指向我的配置文件夹的路径,在此之前我会检查该文件是否确实存在(确实存在)。在一台机器上,这个例程对我来说返回false。例外情况是没有文件访问权限。 如果我重写此例程:

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例程显然可以访问该文件


有人能给我解释一下这两种方法的区别吗?文件访问权限不应该由应用程序的权限决定吗?是否有更好的方法来确定我是否具有文件的读/写访问权限?

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


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

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


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

使用IO.file.Exist()例程检查文件是否存在。您不需要读取文件内容。

使用IO.file.Exist()例程检查文件是否存在。您不需要读取文件内容。

我不建议您打开文件以确定访问权限。请看这个答案:作为旁白,不要使用字符串连接来创建文件名。使用Path类中的方法,特别是使用
Path.Combine(frmMain.APPDATA,“regid.bin”)
。在这种情况下,这并没有什么区别,因为我知道APPDATA中的任何内容。但是你是对的,path.combine方法在大多数情况下都是一个好主意。我不建议打开文件来确定访问权限。请看这个答案:作为旁白,不要使用字符串连接来创建文件名。使用Path类中的方法,特别是使用
Path.Combine(frmMain.APPDATA,“regid.bin”)
。在这种情况下,这并没有什么区别,因为我知道APPDATA中的任何内容。但是你是对的,path.combine方法在大多数情况下都是一个好主意。谢谢。我会检查我是否有对文件的写入权限并报告。好的,我确实只有对该计算机上的文件的读取权限。这本身就很奇怪,我不知道为什么,但这解释了给定的场景。谢谢,谢谢。我会检查我是否有对文件的写入权限并报告。好的,我确实只有对该计算机上的文件的读取权限。这本身就很奇怪,我不知道为什么,但这解释了给定的场景。谢谢。我是按照我在帖子里写的那样做的。但是仅仅存在该文件是不够的,并且没有说明对该文件的访问权限。使用IO.file.GetAccessControl方法并添加一个新的安全规则。但是仅仅存在文件是不够的,并且没有说明对文件的访问权限。请使用IO.file.GetAccessControl方法并添加新的安全规则。