System.IO.FileShare是否有限制?

时间:2011-08-05 11:50:56

标签: 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.ReadSystem.IO.FileShare.WriteSystem.IO.FileShare.ReadWrite的使用是否有限制?

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

6 个答案:

答案 0 :(得分:4)

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

http://msdn.microsoft.com/en-us/library/aa363874%28v=vs.85%29.aspx

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

多个对象可以访问单个文件,但保存文件的磁盘会为每个对象/进程维护读缓存缓冲区,缓存将与访问该文件的对象数相乘。 性能取决于维护每个对象的缓存和缓存内存总容量所需的字节数。

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

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

答案 4 :(得分:0)

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

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

但是,您应始终在内存中保留“最热”数据的缓存以减少负载。没有它,你的磁盘就不会足够快,无法跟上。

答案 5 :(得分:0)

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

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

我重申:您授予其他进程读取和/或写入文件的权限。没什么,没什么。

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

  • 无意味着,门被关闭并锁上。
  • 阅读意味着,你只能走一条路。
  • 写意味着,你只能走另一条路。

那么,门的限制是什么?