У меня странная проблема. Поэтому мой код следует следующим образом.Чтение файла после его написания
ехе принимает некоторые данные от пользователя
вызова веб-службы, чтобы написать (и создать CSV для данных) файл в perticular месте сети (скажем, \ некоторые-сервер \ некоторые-каталог). Хотя этот веб-сервис размещен в том же месте, где находится эта папка (например, я также могу изменить ее как c: \ some-directory). Затем он возвращает после записи файла
exe проверяет, существует ли файл, если файл существует, а затем дальнейшая обработка еще с ошибкой.
Проблемы я имею в шаге 3. При попытке прочитать файл сразу после того, как она была написана, я всегда получаю файл не найдено исключение (но файл там присутствует). Я не получаю это исключение, когда я отлаживаю (потому что тогда я помещаю задержку, отлаживая код) или когда Thread.Sleep(3000)
перед чтением файла.
Это действительно странно, потому что я закрываю StreamWriter
, прежде чем возвращать вызов exe. Теперь, согласно документу, закрытие должно заставить поток потока. Это также не связано с размером файла. Также я не выполняю вызовы потоков Async для записи и чтения файла. Они работают в одном потоке поочередно один за другим (только запись выполняется с помощью веб-службы, а чтение выполняется с помощью exe. По-прежнему звонок является серийным)
Не знаю, но похоже, что есть разница во времени между файлом на самом деле записывается на диск и когда вы делаете Close()
. Однако это непонятно, потому что это совсем не связано с размером. Это происходит для всех файлов. Я пробовал это с файлом с 10, 50, 100 200 строками данных.
Еще одна вещь, которая, как я подозревала, была с тех пор, как я писал этот файл в сетевом расположении, может быть, окна оптимизируют вызов, сначала записывая кеш, а затем в сетевое местоположение. Поэтому я пошел дальше и изменил код, чтобы записать его на диск (например, c: \ some-directory), а не в сетевом расположении. Но это также привело к той же ошибке.
Код ошибки (для чтения и записи) отсутствует. Как объяснялось ранее, путем задержки, он начинает работать нормально. Другая полезная информация
- exe is .Net Framework 3.5
- Windows Server 2008 (64 бит, 4 GB Ram)
Edit 1 File.AppendAllText()
не является правильным решением, так как он создает новый файл, если он не выходит из
Редактировать 2 код для записи
using (FileStream fs = new FileStream(outFileName, FileMode.Create))
{
using (StreamWriter writer = new StreamWriter(fs, Encoding.Unicode))
{
writer.WriteLine(someString)
}
}
код для чтения
StreamReader rdr = new StreamReader(File.OpenRead(CsvFilePath));
string header = rdr.ReadLine();
rdr.Close();
Edit 3 используется TextWriter, та же ошибка
using (TextWriter writer = File.CreateText(outFileName))
{
}
Edit 3 Наконец, как предложено некоторыми пользователями, я делаю чек на файл в то время как петли для некоторого числа раз до того, как я выброшу исключение из файла, который не найден.
int i = 1;
while (i++ < 10)
{
bool fileExists = File.Exists(CsvFilePath);
if (!fileExists)
System.Threading.Thread.Sleep(500);
else
break;
}
Просто эксперимент: вы пробовали добавления вместо чтения (скажем, 'File.AppendAllText'). Будет ли он молча обновлять файл или давать сообщение об ошибке (что-то связано с конфликтами файлов). –
Включена ли функция «Включить кэширование записи на диск» для вашего жесткого диска? [КАК: вручную включить кэширование записи на диск) (http://support.microsoft.com/kb/324805). –
Все началось с первого раза с помощью File.AppendAllText..Lemme попробуйте и протестируйте его с помощью серверного времени, чтобы доказать, что это работает. Немного странно? – Anand