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
пример.