Освобождение доступа к файлам - PullRequest
0 голосов
/ 07 января 2012

Предположим, у нас есть 3 процесса, они записывают в определенный файл по порядку, в некоторых случаях, когда процесс хочет записать в файл закрытый процесс (в середине записи), поэтому доступ к файлу для других 2 процессов находится в проблема, я добавляю процесс сервера, который контролирует порядок процессов, и когда процесс закрывается, возникает событие, так как я могу освободить источники (доступ к файлу) в этом событии, когда процесс закрыт. Что-то вроде File.Release(FilePath);

Edit:

Запись в файл следующим образом:

try {
        if(!File.Exists(FilePath))
            throw new Exception("File does not Exist.");

        bool Clear = false;
        using(StreamReader sr = new StreamReader(FilePath)) {
            if(sr.ReadToEnd().Length > 1200)
                Clear = true;
            }

        if(Clear)
            using(StreamWriter sw = new StreamWriter(FilePath, false)) {
                sw.WriteLine(Text);
                sw.Flush();
        } else
            using(StreamWriter sw = new StreamWriter(FilePath, true)) {
                sw.WriteLine(Text);
                sw.Flush();
        }
} catch(Exception ex) {}

1 Ответ

5 голосов
/ 07 января 2012
using System.IO;

class Program
{
    static void Main()
    {
          using (StreamWriter writer = new StreamWriter("important.txt"))
          {
                writer.Write("Word ");
                writer.WriteLine("word 2");
                writer.WriteLine("Line");
          }
    }
}

Это типовой пример, который мы имели в виду при использовании слова «ключевое слово». Никогда не закрывайте Streamwriter явно и не удаляйте его явно. Использование делает всю магию для вас. Распоряжается, когда работа завершена, и когда вы выходите из этого, используя блок.

В многопоточной среде, если вы используете close или dispose явно, потоки будут иметь проблемы, учитывая, что поток может просто попытаться открыть объект, в то время как предыдущий поток только что удалил его. у вас будут проблемы с синхронизацией ваших потоков. Это та же проблема, с которой обычно сталкиваются в серверных приложениях, которые имеют несколько подключений к базе данных. Вот почему мы должны использовать его с Idisposable.

C # USING ключевое слово - когда и когда его не использовать?

Это объясняет больше об этом.

Обновление: Ваша проблема заключается в одновременной записи нескольких клиентов в один файл. Как уже говорилось выше, ни один процесс не может получить один и тот же файл одновременно в режиме записи. Либо приходится ждать, если вы пишете большие данные, это время ожидания значительно заметно, либо вы можете собирать объекты с клиентов, ставить их в очередь и фактически записывать их с сервера. Также можно избежать предоставления клиенту доступа на запись к файлу, находящемуся на сервере. Если ваши данные сериализуются, вы можете использовать буферы протокола Google для передачи данных.

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

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