我想构建自己的平面文件数据库。以下是我访问平面文件数据库的方法
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
同时访问单个文件?< / p>
答案 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意味着您授予其他进程在打开文件时读取或写入文件的权利。
我重申:您授予其他进程读取和/或写入文件的权限。没什么,没什么。
让我们把文件共享位想象成一扇门:
那么,门的限制是什么?