文件流.SafeFileHandle *真的*设置当前流位置为0

本文关键字:位置 设置 SafeFileHandle 真的 文件 | 更新日期: 2023-09-27 18:11:34

根据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的代码,所以对我来说流位置是否会改变是非常重要的!

是我误解了文档,还是它不正确?或者它是否有时会改变流的位置?(那会是一场噩梦!)

文件流.SafeFileHandle *真的*设置当前流位置为0

我认为文档实际上是在谈论FileStream使用的输入和输出缓冲区("FileStream缓冲输入和输出以获得更好的性能。")。

如果你使用。net库参考源代码,你可以看到SafeFileHandle属性实际上会刷新所有缓冲区(即缓存),并将位置重置为零。它不涉及保存文件实际读(或写)距离信息的变量。反过来,Position属性总是使用该变量(加上缓冲区/缓存偏移量)来返回它的值。

重要的部分似乎是这样的:

允许文件被移动或流位置被重置使用此属性返回的SafeFileHandle的另一个流。

基本上,SafeFileHandle保证您可以使用返回值(例如SetFilePointer)访问文件,并且(最终)缓存FileStream实例没有问题。