![](/img/trans.png)
[英]retaining the precison after reading and writing the double values to binary file
[英]Reading file after writing it
我有一個奇怪的問題。 所以我的代碼如下。
exe從用戶那里獲取一些數據
調用Web服務在特定網絡位置(例如\\ some-server \\ some-directory)寫入文件(並為數據創建CSV)。 雖然此Web服務托管在此文件夾所在的同一位置(即我也可以將其更改為c:\\ some-directory)。 然后在寫入文件后返回
exe檢查文件是否存在,如果文件存在則進一步處理其他錯誤。
我遇到的問題是在第3步。當我嘗試在文件寫入后立即讀取文件時,我總是得到文件未找到異常(但文件存在)。 我在調試時沒有得到這個異常(因為那時我通過調試代碼來延遲)或者在讀取文件之前的Thread.Sleep(3000)
。
這真的很奇怪,因為我在返回對exe的調用之前關閉了StreamWriter
。 現在根據文檔,close應強制刷新流。 這也與文件的大小無關。 此外,我沒有進行異步線程調用來寫入和讀取文件。 它們一個接一個地串行運行在同一個線程中(只有寫入由Web服務完成,讀取由exe完成。仍然是調用串行)
我不知道,但感覺文件實際寫在磁盤上和你做Close()
時有一些時間差異。 然而這令人困惑,因為這與尺寸無關。 這適用於所有文件大小。 我試過這個帶有10,50,100,200行數據的文件。
我懷疑的另一件事是,因為我將此文件寫入網絡位置,可能是Windows通過首先寫入緩存然后寫入網絡位置來優化調用。 所以我繼續改變代碼將其寫入驅動器(即使用c:\\ some-directory),而不是網絡位置。 但它也導致了同樣的錯誤。
代碼中沒有錯誤(用於讀寫)。 如前所述,通過延遲,它開始正常工作。 一些其他有用的信息
編輯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.