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