C# FileAccess 枚举
最后修改于 2025 年 4 月 20 日
本教程解释了如何在 C# 中使用 FileAccess 枚举来控制文件访问权限。FileAccess 指定对文件的读取、写入或读/写访问权限。
FileAccess 枚举是 System.IO 命名空间的一部分。它定义了对文件的读取、写入或读/写访问的常量。这些权限在使用 FileStream 或类似类打开文件时使用。
FileAccess 通过显式声明预期的访问模式来帮助确保正确的文件处理。这可以防止意外修改并提高文件操作的安全性。
FileAccess 基本示例
此示例演示如何使用 FileAccess.Read 以只读访问权限打开文件。我们将读取文本文件的内容。
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string path = "example.txt";
File.WriteAllText(path, "Hello FileAccess!");
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
using (var reader = new StreamReader(fs, Encoding.UTF8))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
}
}
该代码创建一个具有写入访问权限的文件,然后以只读权限打开它。FileStream 构造函数将 FileAccess.Read 作为第三个参数。这确保了该文件只能被读取,而不能被修改。
StreamReader 读取整个文件内容。尝试写入此流将引发异常。这演示了 FileAccess 如何在流级别强制执行访问限制。
使用 FileAccess.Write 写入文件
此示例演示如何使用 FileAccess.Write 以只写访问权限打开文件。我们将文本追加到现有文件。
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string path = "log.txt";
using (var fs = new FileStream(path, FileMode.Append, FileAccess.Write))
using (var writer = new StreamWriter(fs, Encoding.UTF8))
{
writer.WriteLine($"{DateTime.Now}: Log entry added");
}
Console.WriteLine("Log entry written successfully");
}
}
FileStream 在追加模式下以 FileAccess.Write 权限打开。这允许写入文件,但阻止从中读取。 StreamWriter 添加一个带时间戳的日志条目。
尝试从此流读取将引发异常。这演示了 FileAccess.Write 如何将操作限制为仅写入。它对于只需要追加数据的日志文件很有用。
使用 FileAccess.ReadWrite 进行读/写访问
此示例演示了使用 FileAccess.ReadWrite 进行完全读/写访问。我们将就地修改配置文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "config.dat";
File.WriteAllText(path, "Initial configuration");
using (var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
{
// Read existing content
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string content = System.Text.Encoding.UTF8.GetString(buffer);
Console.WriteLine("Original: " + content);
// Modify content
fs.Position = 0;
string newContent = "Modified configuration";
byte[] newData = System.Text.Encoding.UTF8.GetBytes(newContent);
fs.Write(newData, 0, newData.Length);
fs.SetLength(newData.Length);
}
Console.WriteLine("File updated successfully");
}
}
该文件以 FileAccess.ReadWrite 打开,允许读取和写入操作。我们首先读取现有内容,然后用新数据覆盖它。 Position 属性重置为写入的开头。
当您需要读取和修改文件的内容时,FileAccess.ReadWrite 非常有用。该示例展示了如何在读取和写入操作之间切换时正确处理文件位置。
将 FileAccess 与 FileShare 结合使用
此示例演示了如何将 FileAccess 与 FileShare 结合使用来控制其他进程如何访问文件。我们将创建一个具有共享读取访问权限的文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "shared.txt";
using (var fs = new FileStream(
path,
FileMode.Create,
FileAccess.ReadWrite,
FileShare.Read))
{
// Write initial data
byte[] data = System.Text.Encoding.UTF8.GetBytes("Shared content");
fs.Write(data, 0, data.Length);
// Simulate another process reading the file
try
{
using (var sharedFs = new FileStream(
path,
FileMode.Open,
FileAccess.Read,
FileShare.Read))
{
Console.WriteLine("File opened successfully in another process");
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
}
FileStream 使用 FileAccess.ReadWrite 和 FileShare.Read 创建。这允许其他进程打开该文件进行读取,但不能进行写入。该示例模拟了另一个进程访问该文件。
FileAccess 和 FileShare 的结合使用提供了对多进程场景中文件共享的细粒度控制。这对于需要在进程之间协调文件访问的应用程序特别有用。
处理访问被拒绝错误
此示例演示了在文件访问被拒绝时如何进行正确的错误处理。我们将尝试使用冲突的权限打开文件。
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "locked.txt";
File.WriteAllText(path, "Test content");
// First process locks the file
using (var lockedFs = new FileStream(
path,
FileMode.Open,
FileAccess.Read,
FileShare.None))
{
Console.WriteLine("File locked by first process");
try
{
// Second process tries to access
using (var fs = new FileStream(
path,
FileMode.Open,
FileAccess.Read))
{
Console.WriteLine("This won't be reached");
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("Access denied: " + ex.Message);
}
catch (IOException ex)
{
Console.WriteLine("IO Error: " + ex.Message);
}
}
}
}
第一个 FileStream 使用 FileShare.None 打开文件,阻止其他访问。第二次尝试打开该文件会引发异常。我们捕获 UnauthorizedAccessException 和 IOException 以进行强大的错误处理。
此示例展示了如何在实际应用程序中正确处理访问冲突。 try-catch 块确保应用程序可以从访问被拒绝的情况中优雅地恢复。
FileAccess 与 BinaryReader/Writer
此示例演示了如何将 FileAccess 与 BinaryReader 和 BinaryWriter 结合使用,以进行高效的二进制文件操作。
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "data.bin";
// Write binary data
using (var fs = new FileStream(
path,
FileMode.Create,
FileAccess.Write))
using (var writer = new BinaryWriter(fs))
{
writer.Write(42);
writer.Write(3.14159);
writer.Write(true);
}
// Read binary data
using (var fs = new FileStream(
path,
FileMode.Open,
FileAccess.Read))
using (var reader = new BinaryReader(fs))
{
int number = reader.ReadInt32();
double pi = reader.ReadDouble();
bool flag = reader.ReadBoolean();
Console.WriteLine($"Read: {number}, {pi}, {flag}");
}
}
}
二进制文件首先以只写访问权限创建,然后以只读访问权限打开。 BinaryWriter 和 BinaryReader 使用指定的 FileAccess 权限工作。这确保了对二进制文件的正确访问控制。
该示例展示了 FileAccess 如何与二进制文件操作无缝集成。写入和读取操作的分离演示了干净的访问模式分离。
使用 FileAccess 的异步文件操作
此示例演示了如何在 I/O 密集型应用程序中使用 FileAccess 进行异步文件操作,以获得更好的性能。
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
string path = "async.txt";
// Asynchronous write
using (var fs = new FileStream(
path,
FileMode.Create,
FileAccess.Write,
FileShare.None,
4096,
FileOptions.Asynchronous))
using (var writer = new StreamWriter(fs))
{
await writer.WriteLineAsync("Asynchronous line 1");
await writer.WriteLineAsync("Asynchronous line 2");
}
// Asynchronous read
using (var fs = new FileStream(
path,
FileMode.Open,
FileAccess.Read,
FileShare.Read,
4096,
FileOptions.Asynchronous))
using (var reader = new StreamReader(fs))
{
string content = await reader.ReadToEndAsync();
Console.WriteLine("File content:");
Console.WriteLine(content);
}
}
}
FileStream 配置为使用 FileOptions 进行异步操作。 FileAccess 控制访问类型,而操作异步执行。这结合了访问控制和性能优势。
该示例演示了使用 FileAccess 的现代 async/await 模式。对于处理大型文件或许多并发操作的应用程序,异步 I/O 特别有价值。
来源
本教程介绍了如何在 C# 中使用 FileAccess 枚举来控制文件权限,包括使用各种文件处理类的读取、写入和读/写操作。
作者
列出所有 C# 教程。