文章目录
- 1.文件系统操作
- 1.1 常用文件系统类
- 1.2 示例:文件和目录操作
- 2.文件的读取与写入
- 2.1 读取文件内容
- 2.2 写入文件内容
- 2.3 文件的读写优化
- 3.数据流 (Stream)
- 3.1 常用流类
- 3.2 FileStream 示例
- 3.3 MemoryStream 示例
- 4.读写数据的高级技巧
- 4.1 异步文件与流处理
- 4.2 压缩与解压缩流
- 5.实际应用场景
- 5.1 记录日志
- 5.2 处理大型文件
- 5.3 文件监控
1.文件系统操作
C# 中的 System.IO 命名空间提供了多种用于文件系统操作的类,包括 File、FileInfo、Directory 和 DirectoryInfo,这些类封装了对文件和目录的创建、删除、复制、移动和其他操作。
1.1 常用文件系统类
- File:提供静态方法,适合处理文件的常规操作。
- FileInfo:提供实例方法,适合处理文件的详细信息和实例操作。
- Directory:提供静态方法,适合处理目录的常规操作。
- DirectoryInfo:提供实例方法,适合处理目录的详细信息和实例操作。
1.2 示例:文件和目录操作
创建和删除文件
string filePath = "example.txt";
// 创建文件
if (!File.Exists(filePath))
{
File.WriteAllText(filePath, "Hello, File!");
}
// 删除文件
if (File.Exists(filePath))
{
File.Delete(filePath);
}
创建和删除目录
string directoryPath = "exampleDir";
// 创建目录
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
// 删除目录
if (Directory.Exists(directoryPath))
{
Directory.Delete(directoryPath);
}
2.文件的读取与写入
在文件操作中,常见的任务是读取和写入文件内容。C# 提供了 StreamReader 和 StreamWriter 类以及File.ReadAllText 和 File.WriteAllText 方法来简化文本文件的处理。
2.1 读取文件内容
使用 File.ReadAllText 读取文件的所有文本:
string content = File.ReadAllText("example.txt");
Console.WriteLine(content);
使用 StreamReader逐行读取文件内容:
using (StreamReader reader = new StreamReader("example.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
2.2 写入文件内容
使用 File.WriteAllText 写入文件内容:
File.WriteAllText("example.txt", "Hello, World!");
使用 StreamWriter 追加写入内容:
using (StreamWriter writer = new StreamWriter("example.txt", append: true))
{
writer.WriteLine("Additional line.");
}
2.3 文件的读写优化
在频繁文件读写的场景下,考虑使用 BufferedStream 来提高性能,尤其在大型文件操作时效果显著。
3.数据流 (Stream)
流是一个字节序列,用于读取和写入数据。C# 中的 Stream 类是所有流的基类,包含 FileStream、MemoryStream、NetworkStream 等。通过流,可以实现对文件、内存和网络的数据读写。
3.1 常用流类
- FileStream:用于文件的字节流读写。
- MemoryStream:用于内存的字节流处理,适合临时数据存储。
- NetworkStream:用于网络数据的字节流处理,适合网络通信。
- BufferedStream:为其他流添加缓冲,提高读写效率。
3.2 FileStream 示例
写入文件
string filePath = "example.bin";
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
byte[] data = new byte[] { 0x0A, 0x1B, 0x2C };
fs.Write(data, 0, data.Length);
}
读取文件
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
Console.WriteLine(BitConverter.ToString(data));
}
3.3 MemoryStream 示例
MemoryStream 允许在内存中读写数据,适合处理需要临时存储的字节流。
using (MemoryStream ms = new MemoryStream())
{
byte[] data = new byte[] { 0x0A, 0x1B, 0x2C };
ms.Write(data, 0, data.Length);
ms.Position = 0; // 重置位置
int byteRead;
while ((byteRead = ms.ReadByte()) != -1)
{
Console.WriteLine(byteRead);
}
}
4.读写数据的高级技巧
4.1 异步文件与流处理
C# 提供了异步方法以提高文件和数据流操作的性能。例如,FileStream 的 ReadAsync 和 WriteAsync方法可以在不阻塞主线程的情况下读取和写入文件。
异步文件写入
public async Task WriteToFileAsync(string filePath, string content)
{
byte[] encodedText = Encoding.UTF8.GetBytes(content);
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
await fs.WriteAsync(encodedText, 0, encodedText.Length);
}
}
异步文件读取
public async Task<string> ReadFromFileAsync(string filePath)
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None, 4096, true))
{
byte[] buffer = new byte[fs.Length];
await fs.ReadAsync(buffer, 0, (int)fs.Length);
return Encoding.UTF8.GetString(buffer);
}
}
4.2 压缩与解压缩流
通过 System.IO.Compression 命名空间,可以对数据流进行压缩和解压缩。
using System.IO.Compression;
public void CompressFile(string sourceFile, string compressedFile)
{
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
using (FileStream compressedStream = new FileStream(compressedFile, FileMode.Create))
using (GZipStream gzipStream = new GZipStream(compressedStream, CompressionMode.Compress))
{
sourceStream.CopyTo(gzipStream);
}
}
5.实际应用场景
5.1 记录日志
通过 StreamWriter 和 File.AppendAllText 可以记录日志文件,例如错误日志和调试信息。
public void LogMessage(string message)
{
string logFilePath = "log.txt";
File.AppendAllText(logFilePath, $"{DateTime.Now}: {message}\n");
}
5.2 处理大型文件
在处理大型文件时,避免一次性加载文件到内存中,可以使用 BufferedStream 和 FileStream 逐块读取,以减少内存占用。
5.3 文件监控
使用 FileSystemWatcher 类可以监控文件夹和文件的变化,如创建、修改和删除事件。
FileSystemWatcher watcher = new FileSystemWatcher
{
Path = @"C:\path_to_watch",
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName
};
watcher.Changed += (source, e) => Console.WriteLine($"File changed: {e.FullPath}");
watcher.Created += (source, e) => Console.WriteLine($"File created: {e.FullPath}");
watcher.Deleted += (source, e) => Console.WriteLine($"File deleted: {e.FullPath}");
watcher.EnableRaisingEvents = true;