Проблема с чтением текстового файла - PullRequest
0 голосов
/ 05 мая 2011

У меня проблема с чтением текстового файла, проблема не в том, что он сам по себе, а в том, когда я должен его прочитать.

У меня есть серверная программа (сделанная внешней компанией, поэтому яне имеет никакого контроля над ним), где вы можете поместить файлы. Сервер видит, что новый файл прибыл, читает его и делает с ним что-то, а затем он возвращает результат обратно.Итак, я жду, пока файл будет готов, но я не могу прочитать его раньше, потому что я не знаю, существует ли он уже.Итак, я делаю это:

while (IsFileLocked(file))
{
    Thread.Sleep(25);
}

private bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}

Теперь это действительно помогает проверить, доступен ли файл для чтения, и я больше не получаю никаких исключений IOException при чтении.Теперь я начинаю чтение, но иногда я просто читаю пустой файл.И я уверен, что он не должен быть пустым.Это не ошибка серверной программы (я объясню позже).

Вот код, с которого начинается проблема:

using (StreamReader streamReader = file.OpenText())
{
    while (!streamReader.EndOfStream)
    {
         // here starts the reading
    }
}

Но когда я использую этот код, я неПолучите проблему:

using (StreamReader streamReader = file.OpenText())
{
    Thread.sleep(1000);
    while (!streamReader.EndOfStream)
    {
         // here starts the reading
    }
}

Так что я предполагаю, что файл пуст, когда я могу открыть его, но в нем нет текста.Я изменил Thread.sleep на 100 миллисекунд, а затем снова получил проблему.Когда я изменил его на 500, проблема снова была решена.

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

Редактировать: я пытался FileSystemWatcher, и это не решение!

Ответы [ 3 ]

0 голосов
/ 05 мая 2011

Инструмент, который вам нужно добавить, - это FileWatcher (см. MSDN System.IO.FileWatcher ).Это позволит вам отслеживать активность и добавлять обработчики событий в ответ на события файла.Вы можете ответить на созданный файл, добавив обработчик для измененного файла.

0 голосов
/ 08 января 2012

Просто вы можете сделать так:

http://olioul.wordpress.com/2012/01/08/4-text-readwrite-in-text-document/

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