C# System.IO.FileShare是否有限制?

C# System.IO.FileShare是否有限制?,c#,.net,vb.net,file-io,C#,.net,Vb.net,File Io,我想建立自己的平面文件数据库。下面是访问平面文件数据库的方法 Dim fs As New System.IO.FileStream("C:\MyDb.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) Dim sr As New System.IO.StreamReader(fs) 在处理文件时,.Net对System.IO.FileShare.Read、System.IO.FileShare.Write和System.

我想建立自己的平面文件数据库。下面是访问平面文件数据库的方法

Dim fs As New System.IO.FileStream("C:\MyDb.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
Dim sr As New System.IO.StreamReader(fs)
在处理文件时,.Net对
System.IO.FileShare.Read
System.IO.FileShare.Write
System.IO.FileShare.ReadWrite
的使用是否有限制


我的意思是,.Net能够支持成千上万的用户使用文件流流阅读器对象与
System.IO.FileShare.Read
同时访问单个文件?

成员
FileShare
意味着其他文件也可以打开该文件。这并不保证以任何方式同步数据-它只是意味着多个程序现在可以在打开该文件时从该文件中读取数据(因为这是您设置的-
FileShare.read

如果使用
ReadWrite
,则多个程序可以读取和写入文件。同样,您将不会收到任何更改的通知。如果多个程序与一个流同时写入同一文件,数据将混合在一起,您将得到一个损坏的文件。(腐败意味着您和其他程序都无法对其进行反编译,因为您的数据与您朋友的应用程序交织在一起)


对读取文件的并发程序的数量没有不合理的限制。

如果您试图打开一个访问和共享权限冲突的文件,它将无法工作。 但如果这是一个自定义数据库,为什么需要打开多个文件句柄? 您的自定义数据库软件应该管理打开的句柄(每个文件有一个句柄)。 至于您的具体问题,没有设置限制,但是后续打开文件时需要遵循访问和共享权限规则


您应该只有一个
FileStream
用于写入文件,并使用通常的锁定机制将其使用限制为一次一个线程。DBMS软件的通常模型是有一个并发的写操作队列,并有一个写线程来刷新它们。在需要写入操作的源等待其完成的情况下,可以使用异步模型(BeginWrite/EndWrite)

信号量
可能正是您阅读所需的,因为它允许最大数量的线程在任何时间点访问它。您可以使用它来限制无限次同时随机读取时可能发生的磁盘抖动


但是,您应该始终在内存中保留“最热”数据的缓存,以减少负载。如果没有它,您的磁盘将无法跟上速度。

多个对象可以访问单个文件,但是保存文件的磁盘为每个对象/进程保留读缓存缓冲区,并且缓存将与访问文件的对象数量成倍增加。 性能取决于维护每个对象的缓存所需的字节数和缓存内存的总容量

若在执行读取操作时修改了文件,则应使用异步读取。但是,如果进程终止时锁定了文件的一部分,或者关闭了具有未完成锁定的文件,则该行为是未定义的


我建议在不需要时显式销毁流对象。

打开文件通常意味着它是由您独占打开的,没有其他进程可以访问它,除非您告诉Windows您想共享它

设置FileShare.Read/Write意味着您授予其他进程在打开文件时读取或写入文件的权限

我重申:您授予其他进程读取和/或写入您的文件的权利。不多不少

让我们把文件共享位想象成一扇门:

  • 没有意味着门已经关上并锁上了
  • 阅读意味着,你只能走一条路
  • 写意味着,你只能走另一条路

那么,门的极限是什么呢?

我不知道.NET/windows施加的确切极限,所以我为您创建了一个真正的测试。我运行了以下测试代码几分钟,发现最多使用
system.io.fileshare
635908个数,它仍然可以正常工作,即您仍然可以读取平面数据库文件的内容

以下是代码(它是一个winform应用程序,.Net 4):


您好,我想如果有限制的话,最有可能是.NET包装的底层windows API…除了所有这些I/O请求使用的内核池内存之外,没有任何限制。从你写的文件中读取数千个应用程序是非常勇敢的。无法同步,这些应用程序将读取部分写入的文本行。这就是服务器存在的原因,SQL Server非常受欢迎,文本文件不是数据库。Hans:同步文件访问是发明文件锁定的原因。我建议添加一个数据访问层来执行文件读写以及与该层对话的所有操作。这样,您只有一个进程读取或写入文件,并且您可以处理到数据层的多个连接。请告诉我您的.Net和windows版本,我将为您执行真正的测试
Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim filepath As String = "c:\database.txt"

        Dim filestream As System.IO.FileStream

        Dim count As Int32

        For count = 0 To System.Int32.MaxValue
            filestream = New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)
            AppendLog(count, filestream.ReadByte)
        Next
    End Sub

    Private LogFilepath As String = "C:\LogInfo.txt"
    Private Enter As String = Chr(13) & Chr(10)
    Private Space As String = " "

    Private Sub AppendLog(ByVal Sequence As Int32, ByVal info As Byte)
        System.IO.File.AppendAllText(LogFilepath, Enter & Sequence & Space & CStr(info))
    End Sub

End Class