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