C# FileOptions 枚举
最后修改于 2025 年 4 月 20 日
本教程解释了如何在 C# 中使用 FileOptions 枚举来控制文件处理行为。FileOptions 提供了文件操作的高级选项。
FileOptions 枚举指定了创建 FileStream 对象的高级选项。这些选项控制缓存、写入行为和其他文件系统操作。
FileOptions 在创建 FileStream 实例时使用,以优化性能或确保特定行为。它是 .NET 中 System.IO 命名空间的一部分。
基本的 FileOptions 示例
此示例演示了在使用 FileStream 创建时使用 FileOptions.None 作为默认选项。 它展示了基本的文件操作。
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 确保数据直接写入磁盘,而无需中间缓存。 此示例展示了如何使用它。
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 启用异步文件操作。 此示例演示了异步文件写入。
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 优化了顺序文件访问。 此示例展示了按顺序读取文件。
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 组合。 此示例展示了如何一起使用多个选项。
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 在关闭时自动删除文件。 此示例演示了临时文件处理。
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 请求在文件系统级别进行文件加密。 此示例展示了如何创建加密文件。
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 处理。 请注意,这与应用程序级别的加密不同。
来源
本教程介绍了如何在 C# 中使用 FileOptions 枚举来控制文件处理行为,包括各种选项及其组合。
作者
列出所有 C# 教程。