2015-12-17 154 views
1

我目前正在嘗試讀取文件,修改內部的一些佔位符,然後將文件寫入輸出流。作爲aspx.net中的頁面響應的輸出流,我在那裏使用了OutputStream.Write方法(文件最後是一個附件)。有沒有更好的方法來寫入讀取和修改文本行並將它們寫入輸出流?

我原本:

using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    while (readBytes < fs.Length) 
    { 
     tmpReadBytes = fs.Read(bytes, 0, bytes.Length); 
     if (tmpReadBytes > 0) 
     { 
      readBytes += tmpReadBytes; 
      page.Response.OutputStream.Write(bytes, 0, tmpReadBytes); 
     } 
    } 
} 

想事以後在我想出了以下內容:

foreach(string line in File.ReadLines(filename)) 
{ 
    string modifiedLine = line.Replace("#PlaceHolder#", "NewValue");  
    byte[] modifiedByteArray = System.Text.Encoding.UTF8.GetBytes(modifiedLine);  
    page.Response.OutputStream.Write(modifiedByteArray, 0, modifiedByteArray.length); 
} 

但它看起來低效尤其是與轉換。所以我的問題是:有沒有更好的方法來做到這一點?

注意文件本身並不是很大,它是一個大約3-4 KB大小的文本文件。

+2

爲什麼你讀取字節而不是文本,如果你有什麼是文本? – Albireo

+1

Response.WriteLine(modifiedLine);'? – Luaan

+0

@Albireo最初的代碼不是來自我(我接管了那個項目)。我猜這是因爲當時他使用.Write爲OutputStream,他不想轉換讀取的字節,因此使用FileStream .Read方法和讀取字節,而不是文本) – Thomas

回答

2

你不需要處理你自己的字節。

如果知道該文件是而且將永遠是小,

this.Response.Write(File.ReadAllText("path").Replace("old", "new")); 

否則

using (var stream = new FileStream("path", FileMode.Open)) 
{ 
    using (var streamReader = new StreamReader(stream)) 
    { 
     while (streamReader.Peek() != -1) 
     { 
      this.Response.Write(streamReader.ReadLine().Replace("old", "new")); 
     } 
    } 
} 
+0

以後的方法當前如何編寫它只會讀取和寫入總共一行? – Thomas

+0

@Thomas是的,我腦袋放屁。固定。 – Albireo

+0

可以發生即使是最好的:)接受你的答案。再次在那裏! – Thomas

0

爲了得到一個字符串數組的行:

string[] lines = File.ReadAllLines(file); 

要改變線,使用循環。

for (int i = 0; i < lines.Length; i++) 
{ 
    lines[i] = lines[i].Replace("#PlaceHolder#", "NewValue"); 
} 

並且爲了保存新文本,首先創建一個包含所有行的字符串。

string output = ""; 
foreach(string line in lines) 
{ 
    output+="\n"+line; 
} 

然後將字符串保存到文件中。

File.WriteAllText(file,output);

相關問題