2011-03-07 81 views
3

我想要做的是記住我在輸入流中的位置,然後再回到那裏。 在java中使用mark()和reset()很簡單,但我不知道如何在c#中實現這一點。沒有這樣的方法。C#StreamReader標記問題

例如

public int peek() 
{ 
    try 
    { 
     file.x; //in java file.mark(1) 
     int tmp = file.read(); 
     file.+ //in java file.reset(); 
     return tmp; 
    } 
    catch (IOException ex) {} 
    return 0; 
} 

回答

5

確實沒有,我知道的。然而,你可以使用像一個堆棧,只是推()和pop()關閉此去向上和向下的標記依次是:

FileStream file = new FileStream(...); 

try { 
    Stack<long> markers = new Stack<long>(); 

    markers.Push(file.Position); 

    file.Read(....); 

    file.Seek(markers.Pop(),SeekOrigin.Begin); 
} finally { 
    file.Close(); 
} 

基於字典另一個想法:

FileStream file = new FileStream(...); 

try { 
    Dictionary<string,long> markers = new Dictionary<string,long>(); 

    markers.Add("thebeginning",file.Position); 

    file.Read(....); 

    file.Seek(markers["thebeginning"],SeekOrigin.Begin); 
} finally { 
    file.Close(); 
} 
+1

+1,很好的解決方案,但我相信你的意思是,重新建立了新初始化在另一個範圍內,即類級別? ;) – Abel 2011-03-07 11:39:45

+0

不一定,取決於你想在哪裏使用它,這裏的堆棧立即和文件I/O調用的範圍相同。 Stack <>也只是一個解決方案,你可以使用一個字典,實際上給NAMED標記,而不是所有肉汁:) – Lloyd 2011-03-07 11:41:38

+0

+1,就像那個解決方案!也可以:對FileStream進行子類化並將該堆棧添加到該類中 – Sascha 2011-03-07 11:42:24

0

如果您使用的是StreamReader,你要記住,它不完全是一個Stream本身,而是你可以訪問它的BaseStream屬性:

StreamReader reader = new StreamReader("test.txt"); 
Stream stream = reader.BaseStream; 

它會給你的當前位置在流中:

long pos = stream.Position; 

而且它可以讓你回到那裏移動:

stream.Seek(pos, SeekOrigin.Begin); 
+0

該解決方案也適用 – Strausa 2011-03-07 14:00:51