FileStream.SafeFileHandle * действительно * устанавливает текущую позицию потока в 0?

Согласно документации MSDN дляFileStream.SafeFileHandle:

Свойство 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для меня очень важно, будет ли изменена позиция потока или нет!

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

1 ответ

Решение

Я думаю, что документация на самом деле говорит о буферах ввода и вывода, используемых FileStream ( "FileStream буферизует ввод и вывод для лучшей производительности.")

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

Важная часть, кажется, это:

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

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

Другие вопросы по тегам