2013-04-16 100 views
0

我在一個變量中有一個字節文件,我想把它放到FileStream中用於將它用於StreamReader用FileStream直接讀取一個字節文件(不含路徑)

我可以這樣做嗎?

我看到FileStream使用一個路徑,但有沒有辦法讀取我的字節文件?

我有這樣的事情,當然myByteDocument不起作用,因爲它不是一個路徑:

file = new FileStream(myByteDocument, FileMode.Open, FileAccess.Read, FileShare.Read); 

reader= new StreamReader(file); 
reader.BaseStream.Seek(0, SeekOrigin.Begin); 
string fullText= ""; 
while (reader.Peek() > -1) 
{ 
    fullText+= reader.ReadLine(); 
} 
reader.Close(); 

myByteDocument是獲得這樣的:

DataRow row = vDs.Tables[0].Rows 
byte[] myByteDocument = (byte[])row.ItemArray[0]; 

我閱讀文檔,並將其放入一個字符串中以替換它的某些部分,然後在全部替換之後,我創建了一個帶有fullText變量的新文檔,其中之類的文檔,其中swStreamWriter

所以,我想直接讀取文件,而不知道路徑,但與字節文件。我可以這樣做嗎?

如果我不清楚,請不要猶豫,說出來。

+1

究竟是什麼字節文件?它是一個字節數組還是類似的東西?你能展示你如何創建這個對象myByteDocument嗎? –

+0

是的,那還不清楚......你的意見是什麼?字節數組?流?它從何而來? – ken2k

+0

根據你的代碼編輯獲得'myByteDocument',它仍然不清楚它是什麼。 '的DataRow。ItemArray []'只是返回一個對象。所以它可能仍然是任何東西。我猜這個文件存儲在數據庫中?如果是這樣,它是如何存儲的? – psubsee2003

回答

3

您應該查看MemoryStream類,而不是FileStream。它應該提供讀取文件時所需的功能,而不必知道路徑(提供的myByteDocument是一個字節數組)。

var file = new MemoryStream(myByteDocument); 

基本上可以使用相同的代碼只是替換MemoryStream的構造函數,你試圖使用FileStream構造函數。

string fullText= ""; 

using(var file = new MemoryStream(myByteDocument)) 
using(var reader = new StreamReader(file)) 
{ 
    reader.BaseStream.Seek(0, SeekOrigin.Begin); 
    while (!reader.EndOfStream) 
    { 
     fullText += reader.ReadLine(); 
    } 
} 

請注意,我還爲文件訪問添加了using塊。這比僅僅調用reader.Close()好得多,因爲它將確保清理資源,即使調用Close()方法不會發生異常。

+0

如果'myByteDocument'是一個字符串,他可以使用'StringReader'。 –

+0

@JimMischel是真的,但如果它是一個'String',那麼它就會破壞所有這一切的目的,因爲他只是試圖將該文件讀取到字符串中。 – psubsee2003

+0

你的回答就是我要說的,這就是爲什麼我贊成你的原因。但是OP說他創建了一個字符串,做了一些替換等。直到他最近的編輯,我都不清楚myByteDocument的真正含義。 –

1

你需要的是將你的字節數組轉換爲字符串,然後替換你所需要的,然後寫出最終的結果。 你甚至不需要StreamReader或編寫器來做到這一點。

看看這篇文章: How to convert byte[] to string?

在這裏,你有不同的方法將文檔轉換爲字符串。 接受答案的一個是:

string result = System.Text.Encoding.UTF8.GetString(myByteDocument) 

一旦你完成了所有的更換,只需保存串入一個文件,用類似的東西(最簡單的辦法):

File.WriteAllText(path, result);