Согласно 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
, поэтому для меня очень важно, будет ли изменено положение потока или нет!
Я неправильно понял документацию, или она неверна? Или он меняет положение потока иногда? (Это был бы кошмар!)
Не означает ли документация, что файл сбрасывается, а положение потока сбрасывается, когда ручка закрыта или удалена? – adrianm
@adrianm Хорошо, если вы закроете SafeHandle с помощью 'SafeHandle.Close()', вы больше не можете обращаться к файлу через 'FileStream', так что это не имеет особого смысла ... Я обновил свой вопрос с помощью этой информации , –
Это прокомментированный [исходный код] (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