2013-04-30 3 views
4

Согласно MSDN documentation for FileStream.SafeFileHandle:Действительно ли FileStream.SafeFileHandle * действительно устанавливает текущую позицию потока в 0?

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

Однако, мои тесты, кажется, указывают, что позиция поток не изменилось.

Рассмотрим следующий код:

using System; 
using System.IO; 

namespace Demo 
{ 
    internal static class Program 
    { 
     public static void Main() 
     { 
      Directory.CreateDirectory("C:\\TEST"); 
      var buffer = new byte[1024]; 

      using (var file = new FileStream("C:\\TEST\\TEST.BIN", FileMode.Create)) 
      { 
       file.Write(buffer, 0, buffer.Length); 
       Console.WriteLine(file.Position); // Prints 1024 
       var dummy = file.SafeFileHandle; 
       // dummy.Dispose();    // Uncommenting this line will make the next line throw. 
       Console.WriteLine(file.Position); // Still prints 1024! 
      } 
     } 
    } 
} 

Если доступ SafeFileHandle действительно сбросить текущую позицию потока до 0, я бы ожидал, что второй WriteLine() для печати 0.

У меня есть другие где я на самом деле использую SafeFileHandle с методами чтения Windows API ReadFile() и WriteFile(), и даже тогда он не изменит указатель на файл.

У меня есть код, который использует SafeFileHandle, поэтому для меня очень важно, будет ли изменено положение потока или нет!

Я неправильно понял документацию, или она неверна? Или он меняет положение потока иногда? (Это был бы кошмар!)

+0

Не означает ли документация, что файл сбрасывается, а положение потока сбрасывается, когда ручка закрыта или удалена? – adrianm

+0

@adrianm Хорошо, если вы закроете SafeHandle с помощью 'SafeHandle.Close()', вы больше не можете обращаться к файлу через 'FileStream', так что это не имеет особого смысла ... Я обновил свой вопрос с помощью этой информации , –

+0

Это прокомментированный [исходный код] (http://www.dotnetframework.org/default.aspx/DotNET/DotNET/[email protected]/untmp/whidbey/REDBITS/ndp/clr/src/BCL/System/IO/ FileStream @ cs/2/FileStream @ cs) для класса FileStream.В нем есть разные позиции (_pos, _readPos, _writePos). Надеюсь, это поможет вам. – Vladimir

ответ

5

Я думаю, что документация фактически говорит о входных и выходных буферах, используемых FileStream ("FileStream buffers input and output for better performance.").

Если используются эталонным источник библиотеки .NET, вы можете увидеть, что SafeFileHandle свойства фактически сбрасывает все буфера (то есть кэша) и сбрасывает их позиции обратно к нулю. Он не касается переменной, которая содержит информацию о том, как далеко файл действительно был прочитан (или написан). Свойство Position, в свою очередь, всегда использует эту переменную (плюс смещения буфера/кеша), чтобы вернуть ее значение.

важная часть, как представляется, это:

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

В принципе, SafeFileHandle гарантирует вам, что вы можете использовать возвращаемое значение (например, с SetFilePointer), чтобы получить доступ к файлу, и никаких проблем с (в конечном счете) кэширования экземпляра FileStream.

+1

Я собирался написать то же самое, +1. Я думаю, что это ошибка в документации на самом деле, потому что она (по крайней мере) не совсем понятна. Позиция остается неизменной. – ken2k

+0

Ну, это звучит правдоподобно. Немного странно, что в документации явно указано «текущая позиция потока», особенно когда документация для FileStream.Position' говорит «Возвращает или устанавливает текущую позицию этого потока». Таким образом, документация считает, что «текущая позиция потока» НЕ такая же, как «текущая позиция этого потока»! Вы можете понять мое замешательство! –

+1

@ ken2k Если бы это зависело от меня ;-) Я бы также сказал, что документация здесь глючит/неточна (учитывая, что мой анализ в первую очередь прав). –

Смежные вопросы