Я пишу приложение для обмена сообщениями на С#, которое работает на общем файловом сервере в сети. Программа работает с несколькими пользователями, запускающими программу, которая обращается к файлу, который используется несколькими компьютерами. Следовательно, мне нужно использовать StreamReader/StreamWriter для одновременного доступа к файлу с несколькими программами (EDIT: теперь я знаю, что это не очень хороший способ сделать это, но это то, что мне было нужно в то время). Итак, как я могу получить доступ к одному файлу с помощью нескольких программ, не получая ошибок об использовании файла?
Многие программы пишут/читают один файл?
Ответы (3)
Я думаю, что ваш подход приведет к проблемам в будущем. Я бы на вашем месте подумал об использовании pub/sub Redis.
Но, поскольку вы спросили... (я написал об этом сообщение в блоге: http://procbits.com/2011/02/18/streamwriter-share-read-access-in-another-process/ )
Генератор данных чата:
var fs = File.Open(@"C:\messages.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
var sw = new StreamWriter(fs);
sw.AutoFlush = true;
Где-то еще в вашем приложении или другом приложении...
Читатели данных чата:
var fs = File.Open(@"C:\messages.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var sr = new StreamReader(fs);
Если вам нужен один файл, в котором несколько пользователей/программ/объектов... должны читать/писать, не мешая друг другу, я бы предложил рассмотреть (среди других решений) использование Sqlite как простой бэкэнд БД. Не требует установки или настройки службы. Просто используйте C#
dll из него и, в принципе, по вашим запросам, вы получите то, что вам нужно.
Один пользователь пишет в db file
(INSERT), другой может читать (SELECT).
DLL
, которую можно скачать с сайта Sqlite
.
- person Tigran; 27.02.2012
.NET
исполняемых файлов находится здесь: Склайт
- person Tigran; 27.02.2012
Я думаю, вам следует дважды подумать, прежде чем использовать текстовый файл в качестве средства связи с одноранговым узлом.
Это все равно, что напрашиваться на неприятности.
Попробуйте вместо этого использовать решение P2P:
чат однорангового канала
Простое приложение для однорангового чата, использующее WCF netPeerTcpBinding
Это даст вам гораздо более подходящую архитектуру для ваших требований.
many programs writing/reading one file
, так как это не тот путь. - person L.B   schedule 27.02.2012how else can I have many people that can see these messages at one time.
Думаешь, другие кодеры делают по-твоему? И да, у меня слишком много предложений, но их трудно обобщить в нескольких предложениях. Если вы зададите конкретный вопрос, я буду рад ответить на него. - person L.B   schedule 27.02.2012