ZetCode

C# FileOptions 枚举

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 C# 中使用 FileOptions 枚举来控制文件处理行为。FileOptions 提供了文件操作的高级选项。

FileOptions 枚举指定了创建 FileStream 对象的高级选项。这些选项控制缓存、写入行为和其他文件系统操作。

FileOptions 在创建 FileStream 实例时使用,以优化性能或确保特定行为。它是 .NET 中 System.IO 命名空间的一部分。

基本的 FileOptions 示例

此示例演示了在使用 FileStream 创建时使用 FileOptions.None 作为默认选项。 它展示了基本的文件操作。

Program.cs
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "testfile.txt";
        
        // Create file with default options
        using (var fs = new FileStream(filePath, 
               FileMode.Create, 
               FileAccess.Write, 
               FileShare.None, 
               4096, 
               FileOptions.None))
        {
            byte[] data = Encoding.UTF8.GetBytes("Hello, FileOptions!");
            fs.Write(data, 0, data.Length);
        }
        
        Console.WriteLine("File created with FileOptions.None");
    }
}

此代码使用默认选项创建一个文件。 FileOptions.None 指定不应使用任何特殊选项。 FileStream 是使用典型参数创建的,包括文件路径、模式、访问和共享设置。

缓冲区大小设置为 4096 字节。该文件使用 UTF-8 编码写入。 这代表了在 C# 中创建和写入文件的最基本方式,没有任何特殊选项。

使用 FileOptions.WriteThrough

FileOptions.WriteThrough 确保数据直接写入磁盘,而无需中间缓存。 此示例展示了如何使用它。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "writethrough.txt";
        
        // Create file with WriteThrough option
        using (var fs = new FileStream(filePath, 
               FileMode.Create, 
               FileAccess.Write, 
               FileShare.None, 
               4096, 
               FileOptions.WriteThrough))
        {
            byte[] data = { 1, 2, 3, 4, 5 };
            fs.Write(data, 0, data.Length);
            Console.WriteLine("Data written with WriteThrough option");
        }
    }
}

WriteThrough 绕过系统缓存并直接写入磁盘。 当数据完整性至关重要时,这很有用。 该选项确保数据立即物理写入存储。

这会带来性能成本,因为它会阻止写入缓存。 将其用于即使在系统崩溃后也必须持久保存的关键数据。 该示例写入一个简单的字节数组来演示该选项。

使用 FileOptions.Asynchronous

FileOptions.Asynchronous 启用异步文件操作。 此示例演示了异步文件写入。

Program.cs
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string filePath = "asyncfile.txt";
        
        // Create file with Asynchronous option
        using (var fs = new FileStream(filePath, 
               FileMode.Create, 
               FileAccess.Write, 
               FileShare.None, 
               4096, 
               FileOptions.Asynchronous))
        {
            byte[] data = Encoding.UTF8.GetBytes("Asynchronous file operation");
            await fs.WriteAsync(data, 0, data.Length);
            Console.WriteLine("File written asynchronously");
        }
    }
}

异步操作通过不阻塞线程来提高可伸缩性。 FileOptions.Asynchronous 为 FileStream 启用此行为。 该示例使用 async/await 模式进行非阻塞文件操作。

请注意,仅仅添加该选项并不会使操作变为异步 - 您必须使用异步方法。 该选项优化了流以进行异步操作。 这在服务器应用程序中特别有用。

使用 FileOptions.SequentialScan

FileOptions.SequentialScan 优化了顺序文件访问。 此示例展示了按顺序读取文件。

Program.cs
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "sequential.txt";
        
        // First create a file to read
        File.WriteAllText(filePath, "This is some sample text for sequential reading");
        
        // Open with SequentialScan option
        using (var fs = new FileStream(filePath, 
               FileMode.Open, 
               FileAccess.Read, 
               FileShare.Read, 
               4096, 
               FileOptions.SequentialScan))
        {
            byte[] buffer = new byte[1024];
            int bytesRead;
            
            while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
            {
                string text = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                Console.Write(text);
            }
        }
    }
}

SequentialScan 向系统提示将从头到尾读取该文件。 这允许更好的缓存和预取。 当线性处理大型文件时,此选项特别有用。

该示例使用缓冲区分块读取文件。 该系统可能会优化预读操作。 这可以显着提高大型顺序读取(如日志处理)的性能。

组合多个 FileOptions

FileOptions 值可以使用按位 OR 组合。 此示例展示了如何一起使用多个选项。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "combined.txt";
        
        // Combine Asynchronous and WriteThrough options
        var options = FileOptions.Asynchronous | FileOptions.WriteThrough;
        
        using (var fs = new FileStream(filePath, 
               FileMode.Create, 
               FileAccess.Write, 
               FileShare.None, 
               4096, 
               options))
        {
            byte[] data = { 10, 20, 30, 40, 50 };
            fs.Write(data, 0, data.Length);
            Console.WriteLine("File written with combined options");
        }
    }
}

可以使用按位 OR 运算符组合多个选项。 此示例组合了 Asynchronous 和 WriteThrough 选项。 生成的 FileStream 将同时启用这两种行为。

并非所有组合都有意义或被允许。 某些选项可能会相互冲突。 始终测试组合以确保它们提供预期的行为。

使用 FileOptions.DeleteOnClose

FileOptions.DeleteOnClose 在关闭时自动删除文件。 此示例演示了临时文件处理。

Program.cs
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string tempFilePath = Path.GetTempFileName();
        
        // Create temporary file with DeleteOnClose
        using (var fs = new FileStream(tempFilePath, 
               FileMode.Create, 
               FileAccess.Write, 
               FileShare.None, 
               4096, 
               FileOptions.DeleteOnClose))
        {
            byte[] data = Encoding.UTF8.GetBytes("Temporary data");
            fs.Write(data, 0, data.Length);
            Console.WriteLine($"Temporary file created at {tempFilePath}");
        }
        
        // File is automatically deleted after the using block
        Console.WriteLine($"File exists after close: {File.Exists(tempFilePath)}");
    }
}

DeleteOnClose 对于应自动清理的临时文件非常有用。 当流关闭或释放时,该文件将被删除。 该示例使用系统临时目录作为文件位置。

请注意,该文件在使用时存在,但在关闭后立即删除。 此行为与 FileStream 自己的临时文件方法不同。 它提供了对临时文件处理的更多控制。

使用 FileOptions.Encrypted

FileOptions.Encrypted 请求在文件系统级别进行文件加密。 此示例展示了如何创建加密文件。

Program.cs
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "encrypted.dat";
        
        try
        {
            // Create encrypted file
            using (var fs = new FileStream(filePath, 
                   FileMode.Create, 
                   FileAccess.Write, 
                   FileShare.None, 
                   4096, 
                   FileOptions.Encrypted))
            {
                byte[] data = { 1, 2, 3, 4, 5 };
                fs.Write(data, 0, data.Length);
                Console.WriteLine("Encrypted file created");
            }
        }
        catch (PlatformNotSupportedException ex)
        {
            Console.WriteLine($"Encryption not supported: {ex.Message}");
        }
    }
}

FileOptions.Encrypted 请求文件系统级别的加密。 这取决于底层操作系统和文件系统支持。 该示例包括针对不受支持平台的错误处理。

在具有 NTFS 的 Windows 上,这将启用 EFS(加密文件系统)。 实际的加密由操作系统处理,而不是由 .NET 处理。 请注意,这与应用程序级别的加密不同。

来源

FileOptions 枚举文档

本教程介绍了如何在 C# 中使用 FileOptions 枚举来控制文件处理行为,包括各种选项及其组合。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程