2013-07-18 6 views
3

У меня странная проблема. Поэтому мой код следует следующим образом.Чтение файла после его написания

  1. ехе принимает некоторые данные от пользователя

  2. вызова веб-службы, чтобы написать (и создать CSV для данных) файл в perticular месте сети (скажем, \ некоторые-сервер \ некоторые-каталог). Хотя этот веб-сервис размещен в том же месте, где находится эта папка (например, я также могу изменить ее как c: \ some-directory). Затем он возвращает после записи файла

  3. exe ​​проверяет, существует ли файл, если файл существует, а затем дальнейшая обработка еще с ошибкой.

Проблемы я имею в шаге 3. При попытке прочитать файл сразу после того, как она была написана, я всегда получаю файл не найдено исключение (но файл там присутствует). Я не получаю это исключение, когда я отлаживаю (потому что тогда я помещаю задержку, отлаживая код) или когда Thread.Sleep(3000) перед чтением файла.

Это действительно странно, потому что я закрываю StreamWriter, прежде чем возвращать вызов exe. Теперь, согласно документу, закрытие должно заставить поток потока. Это также не связано с размером файла. Также я не выполняю вызовы потоков Async для записи и чтения файла. Они работают в одном потоке поочередно один за другим (только запись выполняется с помощью веб-службы, а чтение выполняется с помощью exe. По-прежнему звонок является серийным)

Не знаю, но похоже, что есть разница во времени между файлом на самом деле записывается на диск и когда вы делаете Close(). Однако это непонятно, потому что это совсем не связано с размером. Это происходит для всех файлов. Я пробовал это с файлом с 10, 50, 100 200 строками данных.

Еще одна вещь, которая, как я подозревала, была с тех пор, как я писал этот файл в сетевом расположении, может быть, окна оптимизируют вызов, сначала записывая кеш, а затем в сетевое местоположение. Поэтому я пошел дальше и изменил код, чтобы записать его на диск (например, c: \ some-directory), а не в сетевом расположении. Но это также привело к той же ошибке.

Код ошибки (для чтения и записи) отсутствует. Как объяснялось ранее, путем задержки, он начинает работать нормально. Другая полезная информация

  1. exe ​​is .Net Framework 3.5
  2. 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; 
} 
+1

Просто эксперимент: вы пробовали добавления вместо чтения (скажем, 'File.AppendAllText'). Будет ли он молча обновлять файл или давать сообщение об ошибке (что-то связано с конфликтами файлов). –

+0

Включена ли функция «Включить кэширование записи на диск» для вашего жесткого диска? [КАК: вручную включить кэширование записи на диск) (http://support.microsoft.com/kb/324805). –

+0

Все началось с первого раза с помощью File.AppendAllText..Lemme попробуйте и протестируйте его с помощью серверного времени, чтобы доказать, что это работает. Немного странно? – Anand

ответ

1

Таким образом, вы пишете поток в файл, а затем читает файл обратно в поток? Вам нужно написать файл, а затем отправить его, или вы можете просто не использовать исходный поток напрямую?

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

+0

Это было бы довольно сложно, потому что письмо выполняется через веб-службу. Я не уверен, что мы можем вернуть FileStream из веб-сервиса ... он не реализует класс Serializable. – Anand

+0

Удовлетворить только выполнимое решение - это цикл, а затем ждать некоторое время в цикле. Таким образом, производительность никогда не будет хуже, чем thread.sleep (n) n секунд. Поэтому, если я делаю 10 попыток прочитать файл в цикле while. Каждый цикл будет ждать n/10 секунд. – Anand

+0

Хммм, это действительно странная проблема. Так что 'File.WriteAllText' не работает? Не имеет смысла. Но опять же, вы использовали Windows Server. Я думаю, что это может иметь какое-то отношение к настройке файловой системы. Вставьте проблему на форумах MSDN, кто-то даст лучшее объяснение. –

0

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

На основе вашего обновления, попробуйте вместо этого:

File.WriteAllText(outFileName, someString); 
header = null; 
using(StreamReader reader = new StreamReader(CsvFilePath)) { 
    header = reader.ReadLine(); 
} 
+0

y Я тоже это пробовал. Вместо того, чтобы напрямую записывать запись на локальный диск, а затем читать ее оттуда. Но это терпит неудачу. Причина, по которой я могу думать, - когда мы вызываем close(), мы даем управление ОС для записи материала на диск. Теперь ОС может оптимизировать это и записать файл на диск, когда это удобно. Я думаю, что сразу же чтение файла даст ошибку, поэтому лучше подождать некоторое время в цикле, чтобы проверить наличие файла – Anand

+0

Поскольку вы используете потоки, вы должны выполнить ручное закрытие и распоряжаться на StreamWriter. Вы пытались использовать 'TextWriter' или' File.WriteAllText'? –

+0

Я не использую нити. Его вызывали поочередно один за другим. Я попробовал метод Close(), прежде чем попытаться прочитать файл. Я использую StreamWriter (который получен из TextWriter) – Anand

0

Вы пытались прочитать после удаления писателя FileStream?

Как это:

using (FileStream fs = new FileStream(outFileName, FileMode.Create)) 
{ 
    using (StreamWriter writer = new StreamWriter(fs, Encoding.Unicode)) 
    { 
     writer.WriteLine(someString) 
    } 
} 

using (StreamReader rdr = new StreamReader(File.OpenRead(CsvFilePath))) 
{ 
    string header = rdr.ReadLine(); 
} 
+0

Да, точно так же. Ничего не получилось. Написал код, используя «using». Вызывается флеш, называемый Close(), используется весь текстовый редактор. Одна важная вещь - чтение работоспособно, если я задержу некоторую задержку, прежде чем попытаюсь ее прочитать ... Угадайте, что это провалилось бы, если бы я не вызывал dispose/close – Anand

Смежные вопросы