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

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

最佳答案

我认为文档实际上是在讨论 FileStream ( "FileStream buffers input and output for better performance." ) 使用的输入和输出缓冲区。

如果您使用 .NET 库引用源,您可以看到 SafeFileHandle 属性实际上刷新了所有缓冲区(即缓存)并将它们的位置重置为零。它不会触及保存有关文件真正被读取(或写入)多远的信息的变量。 Position 属性反过来总是使用该变量(加上缓冲区/缓存偏移量)来返回它的值。

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



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

关于c# - FileStream.SafeFileHandle *真的* 是否将当前流位置设置为 0?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16296481/

10-11 23:11
查看更多