Есть ли предел для System.IO.FileShare? - PullRequest
6 голосов
/ 05 августа 2011

Я хочу создать свою собственную базу данных плоских файлов.Вот как я получаю доступ к базе данных плоских файлов

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 для одновременного доступа к одному файлу?

Ответы [ 6 ]

4 голосов
/ 05 августа 2011

Если вы попытаетесь открыть файл с конфликтующим доступом и разрешить общий доступ, он не будет работать.Но если это пользовательская база данных, зачем вам нужно открывать более одного дескриптора файла?Ваше программное обеспечение базы данных должно управлять открытыми дескрипторами (по 1 на файл).Что касается вашего конкретного вопроса, то здесь нет установленного ограничения, но при последующих открытиях файла необходимо следовать правилам доступа и общего доступа.

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

3 голосов
/ 05 августа 2011

Элемент FileShare означает, что другие файлы также могут открывать файл.Это не гарантирует, что данные будут синхронизированы каким-либо образом - это просто означает, что несколько программ теперь могут читать (поскольку это то, что вы установили - FileShare.Read) из этого файла, пока он у вас открыт.

Если вы используете ReadWrite, то несколько программ могут читать и записывать в файл.Опять же, вы не будете уведомлены о любых изменениях.Если несколько программ записывают в один и тот же файл одновременно поток, данные будут смешаны вместе, и вы получите поврежденный файл.(Неправильно означает, что ни вы, ни другая программа не смогут декомпилировать ее, поскольку ваши данные переплетены с приложением ваших друзей).

Не существует необоснованных ограничений на количество одновременных программ, читающих файл.

2 голосов
/ 07 октября 2011

Я не знаю точного ограничения, налагаемого .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
1 голос
/ 06 октября 2011

Несколько объектов могут обращаться к одному файлу, однако диск, на котором сохранены файлы, поддерживает буфер кэша чтения для каждого объекта / процесса, и кэш будет умножаться на количество объектов, обращающихся к файлу. Производительность зависит от количества байтов, необходимого для поддержания кеша на объекты и общей емкости кеш-памяти.

Если файл изменяется при выполнении операции чтения, следует использовать асинхронное чтение. однако, если процесс завершается с блокировкой части файла или закрывает файл с неподтвержденными блокировками, поведение не определено.

Я бы рекомендовал явно уничтожать объекты потока, когда это не требуется.

0 голосов
/ 06 октября 2011

Открытие файла обычно означает, что он открывается исключительно вами, и никакой другой процесс не может получить к нему доступ, если вы не скажете Windows, что хотите поделиться им.

Настройка FileShare.Read/Write означает, что вы предоставляетедругие процессы имеют право на чтение или запись файла, пока он у вас открыт.

Я повторяю: вы предоставляете другим процессам право на чтение и / или запись в ваш файл.Ничего больше, ни меньше.

Давайте представим биты совместного использования файлов как дверь:

  • Ничего не значит, дверь закрыта и заперта.
  • Средства чтения, вы можете идти только в одну сторону.
  • Запись означает, что вы можете идти только в другую сторону.

Итак, каков предел двери?

0 голосов
/ 05 октября 2011

Вы должны иметь только один FileStream для записи в файл и ограничить его использование одним потоком за раз, используя обычные механизмы блокировки. Обычная модель для программного обеспечения СУБД состоит в том, чтобы иметь параллельную очередь операций записи и иметь поток записи, который их сбрасывает. В тех случаях, когда вам нужен источник операции записи для ожидания ее завершения, вы можете использовать асинхронную модель (BeginWrite / EndWrite).

A Semaphore может быть именно тем, что вам нужно для чтения, поскольку он позволяет максимальному количеству потоков иметь доступ к нему в любой момент времени. Вы можете использовать его для ограничения перегрузки диска при неограниченном количестве одновременных случайных чтений.

Однако вы должны ВСЕГДА хранить кэш самых «горячих» данных в памяти, чтобы уменьшить нагрузку. Без него ваш диск просто не будет достаточно быстрым, чтобы его поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...