4

根据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。

我有其他测试,我实际使用SafeFileHandleWindows API ReadFile() 和 WriteFile() 方法,即使那样它似乎也没有改变文件指针。

我有一些使用的代码SafeFileHandle,所以流位置是否会改变对我来说非常重要!

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

4

1 回答 1

5

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

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

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

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

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

于 2013-04-30T09:49:50.500 回答