C# 文件及数据流技术

时间:2024-11-16 16:06:38

文章目录

  • 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;