2011-03-07 3 views
3

То, что я пытаюсь сделать, это запомнить, где я находимся во входном потоке, а затем вернуться туда. Это очень просто в java с помощью меток() и reset(), но я не знаю, как сделать это возможным в C#. Такого метода нет.Вопрос о методе StreamReader C#

, например

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

+0

Не обязательно, зависит от того, где вы хотите его использовать, здесь стек немедленно находится в той же области, что и вызовы ввода файлов. Stack <> - это просто одно решение, вы можете использовать словарь и на самом деле давать маркеры NAMED, это все соус :) – Lloyd

+0

+1, как это решение! Также возможно: Подкласс FileStream и добавьте этот стек в этот класс – Sascha

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