簡體   English   中英

寫完后讀取文件

[英]Reading file after writing it

我有一個奇怪的問題。 所以我的代碼如下。

  1. exe從用戶那里獲取一些數據

  2. 調用Web服務在特定網絡位置(例如\\ some-server \\ some-directory)寫入文件(並為數據創建CSV)。 雖然此Web服務托管在此文件夾所在的同一位置(即我也可以將其更改為c:\\ some-directory)。 然后在寫入文件后返回

  3. exe檢查文件是否存在,如果文件存在則進一步處理其他錯誤。

我遇到的問題是在第3步。當我嘗試在文件寫入后立即讀取文件時,我總是得到文件未找到異常(但文件存在)。 我在調試時沒有得到這個異常(因為那時我通過調試代碼來延遲)或者在讀取文件之前的Thread.Sleep(3000)

這真的很奇怪,因為我在返回對exe的調用之前關閉了StreamWriter 現在根據文檔,close應強制刷新流。 這也與文件的大小無關。 此外,我沒有進行異步線程調用來寫入和讀取文件。 它們一個接一個地串行運行在同一個線程中(只有寫入由Web服務完成,讀取由exe完成。仍然是調用串行)

我不知道,但感覺文件實際寫在磁盤上和你做Close()時有一些時間差異。 然而這令人困惑,因為這與尺寸無關。 這適用於所有文件大小。 我試過這個帶有10,50,100,200行數據的文件。

我懷疑的另一件事是,因為我將此文件寫入網絡位置,可能是Windows通過首先寫入緩存然后寫入網絡位置來優化調用。 所以我繼續改變代碼將其寫入驅動器(即使用c:\\​​ some-directory),而不是網絡位置。 但它也導致了同樣的錯誤。

代碼中沒有錯誤(用於讀寫)。 如前所述,通過延遲,它開始正常工作。 一些其他有用的信息

  1. 該exe是.Net Framework 3.5
  2. Windows Server 2008(64位,4 GB Ram)

編輯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();

編輯3使用的文本編寫器,相同的錯誤

  using (TextWriter writer = File.CreateText(outFileName))
    {
    }

編輯3最后,正如一些用戶所建議的那樣,在拋出未找到文件的異常之前,我正在檢查while循環中的文件一定次數。

int i = 1;
while (i++ < 10)
{
   bool fileExists = File.Exists(CsvFilePath);
   if (!fileExists)
     System.Threading.Thread.Sleep(500);
   else
     break;
}

所以你正在寫一個文件流,然后將文件讀回流? 您是否需要編寫文件然后對其進行處理,或者您是否可以直接使用源流?

如果你需要這個文件,我會使用一個循環來檢查文件是否每秒都存在直到它出現(或者經過了一段時間) - 如果你不能寫文件,編寫器會給你一個錯誤,所以你知道它最終會出現。

由於您是通過網絡編寫的,因此最佳解決方案是首先將文件保存在本地系統中,然后將其復制到網絡位置。 這樣可以避免網絡連接問題。 並且在網絡故障的情況下也有備份。

根據您的更新,請嘗試此操作:

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

處理完作者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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM