Многие программы пишут/читают один файл?

Я пишу приложение для обмена сообщениями на С#, которое работает на общем файловом сервере в сети. Программа работает с несколькими пользователями, запускающими программу, которая обращается к файлу, который используется несколькими компьютерами. Следовательно, мне нужно использовать StreamReader/StreamWriter для одновременного доступа к файлу с несколькими программами (EDIT: теперь я знаю, что это не очень хороший способ сделать это, но это то, что мне было нужно в то время). Итак, как я могу получить доступ к одному файлу с помощью нескольких программ, не получая ошибок об использовании файла?


person Oztaco - Reinstate Monica C.    schedule 26.02.2012    source источник
comment
Извините, но мне не очень понятна связь между файлом и сообщениями чата.   -  person Tigran    schedule 27.02.2012
comment
Я думаю, вам следует пересмотреть свое решение относительно many programs writing/reading one file, так как это не тот путь.   -  person L.B    schedule 27.02.2012
comment
В этом файле хранятся сообщения чата. @L.B как еще я могу иметь много людей, которые могут видеть эти сообщения одновременно. И когда они просматривают сообщения, они будут обновляться каждые несколько секунд, какие-нибудь предложения?   -  person Oztaco - Reinstate Monica C.    schedule 27.02.2012
comment
См. meta.stackexchange.com/questions/2950/   -  person John Saunders    schedule 27.02.2012
comment
Вы должны использовать базу данных. Вот для чего они.   -  person John Saunders    schedule 27.02.2012
comment
how else can I have many people that can see these messages at one time. Думаешь, другие кодеры делают по-твоему? И да, у меня слишком много предложений, но их трудно обобщить в нескольких предложениях. Если вы зададите конкретный вопрос, я буду рад ответить на него.   -  person L.B    schedule 27.02.2012


Ответы (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);
person JP Richardson    schedule 26.02.2012

Если вам нужен один файл, в котором несколько пользователей/программ/объектов... должны читать/писать, не мешая друг другу, я бы предложил рассмотреть (среди других решений) использование Sqlite как простой бэкэнд БД. Не требует установки или настройки службы. Просто используйте C# dll из него и, в принципе, по вашим запросам, вы получите то, что вам нужно.

Один пользователь пишет в db file (INSERT), другой может читать (SELECT).

person Tigran    schedule 26.02.2012
comment
Использую ли я для этого System.Data.Sql? - person Oztaco - Reinstate Monica C.; 27.02.2012
comment
@EfeOzturkoglu: нет, вам нужно указать ссылку на DLL, которую можно скачать с сайта Sqlite. - person Tigran; 27.02.2012
comment
@EfeOzturkoglu: страница загрузки .NET исполняемых файлов находится здесь: Склайт - person Tigran; 27.02.2012

Я думаю, вам следует дважды подумать, прежде чем использовать текстовый файл в качестве средства связи с одноранговым узлом.
Это все равно, что напрашиваться на неприятности.

Попробуйте вместо этого использовать решение P2P:
чат однорангового канала
Простое приложение для однорангового чата, использующее WCF netPeerTcpBinding

Это даст вам гораздо более подходящую архитектуру для ваших требований.

person Magnus Johansson    schedule 26.02.2012
comment
Это кажется хорошим решением, но я уже написал много кода для работы с текстовым файлом. - person Oztaco - Reinstate Monica C.; 27.02.2012
comment
Большое количество LOC не обязательно оправдывает выбранный метод. - person Magnus Johansson; 27.02.2012
comment
ладно, посмотрю еще разок - person Oztaco - Reinstate Monica C.; 27.02.2012