странное поведение seek C#

У меня есть некоторые трудности со стримом. Я использую FileStream и BinaryReader, и у меня странное поведение. Прежде всего (и это было по другому вопросу, когда я использовал StreamReader, у меня было странное поведение, когда я делал Peek, положение было изменено, поэтому я использовал BinaryReader, который был в порядке) ТЕПЕРЬ у меня есть проблема, что иногда, когда я выполняю поиск (используя Конечно, основной базовый поток - FileStream) ИНОГДА он работает нормально (доходит до нужной позиции), но иногда он просто переходит в позицию, которая намного превышает длину файла. Это происходит не все время, например, у меня была проблема чтобы получить позицию в 1233*267, но через день все было нормально, и проблема была в другом месте.

FileStream m_fsReader = new FileStream(m_strDataFileName, FileMode.Open,         FileAccess.Read, FileShare.ReadWrite);
BinaryReader m_brReader = new BinaryReader(m_fsReader);

и часть поиска:

 m_fsReader.Seek(offset, SeekOrigin.Begin);

Спасибо,


person Boris Raznikov    schedule 23.11.2009    source источник
comment
Вы можете запустить свою программу, изменив FileShare.ReadWrite на FileShare.None?   -  person Andrew Keith    schedule 23.11.2009
comment
проверьте орфографию и переформатируйте вопрос.   -  person leppie    schedule 23.11.2009
comment
Я могу изменить FileShare . Может эта инфа должна помочь, процесс пишет в файл, но иногда захожу и добавляю ДАННЫЕ в файл. Когда система выполняет поиск только один раз, когда она запускает процесс.   -  person Boris Raznikov    schedule 23.11.2009
comment
Приведенный выше код выглядит не так уж плохо — вы уверены, что проблема не в вычислении «смещения»?   -  person fyjham    schedule 23.11.2009
comment
Да, я уверен, что проблема не в расчете   -  person Boris Raznikov    schedule 23.11.2009


Ответы (2)


Я заметил, что каждый поток сохраняет свою позицию. Когда поток создается из другого потока, позиция изначально такая же; но если второй поток выполняет поиск, он не синхронизирует позицию своего базового потока.

Попробуйте посмотреть свойство Position обоих потоков после операции чтения и поиска. Вы увидите расхождения между операцией и значением позиции базового потока.

Я решил эту проблему, вызвав себя Seek в базовом потоке после работы, проделанной подпотоком.

person Luca    schedule 12.09.2011

Трудно сказать, но я совершенно уверен, что если один день работает, а другой нет вероятности, что файл был изменен.

Что касается метода поиска, он позволяет вам искать любое место за пределами длины потока.

Из MSDN:

Вы можете выполнить поиск в любом месте за пределами длины потока. Когда вы ищете за пределами длины файла, размер файла увеличивается.

http://msdn.microsoft.com/en-us/library/system.io.filestream.seek.aspx

person Massimiliano Peluso    schedule 12.09.2011