2011-03-07 75 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