FileStream.SafeFileHandle *是否真的*将当前流的位置设置为0?

时间:2013-04-30 09:26:19

标签: c# filestream safefilehandle

根据MSDN documentation for 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 个答案:

答案 0 :(得分:5)

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

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

重要的部分似乎是这样:

  

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

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