C# 文件及数据流技术

embedded/2024/11/16 20:03:51/

文章目录

  • 1.文件系统操作
  • 2.文件的读取与写入
  • 3.数据流 (Stream)
    • 3.1 常用流类
    • 3.2 FileStream 示例
    • 3.3 MemoryStream 示例
  • 4.读写数据的高级技巧
    • 4.1 异步文件与流处理
    • 4.2 压缩与解压缩流
  • 5.实际应用场景

1.文件系统操作

    C# 中的 System.IO 命名空间提供了多种用于文件系统操作的类,包括 FileFileInfo、DirectoryDirectoryInfo,这些类封装了对文件和目录的创建、删除、复制、移动和其他操作。

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:为其他流添加缓冲,提高读写效率。

FileStream__93">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;

http://www.ppmy.cn/embedded/138090.html

相关文章

【论文阅读】利用SEM二维图像表征黏土矿物三维结构

导言 在油气储层研究中&#xff0c;黏土矿物对流体流动的影响需要在微观尺度上理解&#xff0c;但传统的二维SEM图像难以完整地表征三维孔隙结构。常规的三维成像技术如FIB-SEM&#xff08;聚焦离子束扫描电子显微镜&#xff09;虽然可以获取高精度的3D图像&#xff0c;但成本…

windows下git和TortoiseGit(小乌龟)和putty安装配置对github进行操作

本次安装版本如下&#xff1a; 1&#xff0c;先下载安装tortoiseGit一路下载安装即可一直到在桌面上右键可以看到有git的选项出现为止&#xff0c;注意在第一步的时候选择使用putty还是ssh建立网络连接决定后面的步骤&#xff0c;本次以选择putty为例。 2&#xff0c;安装git&a…

LeetCode题练习与总结:设计推特--355

一、题目描述 设计一个简化版的推特(Twitter)&#xff0c;可以让用户实现发送推文&#xff0c;关注/取消关注其他用户&#xff0c;能够看见关注人&#xff08;包括自己&#xff09;的最近 10 条推文。 实现 Twitter 类&#xff1a; Twitter() 初始化简易版推特对象void post…

SpringBoot+Vue3开发会议管理系统

1 项目介绍 会议管理系统&#xff0c;简化公司内会议方面的流程&#xff0c;提供便捷。实现对会议室的管理、会议的管理、会议预约的管理&#xff0c;三大主流程模块。 系统分为三种角色&#xff0c;分别是员工、管理员和超级管理员。 员工角色功能&#xff1a;查看会议室占…

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (三)

【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 &#xff08;三&#xff09; 一、前言 目前鸿蒙最新系统&#xff0c;经过测试还有两个BLE相关Bug正在修复&#xff1a; 1.获取本地设备蓝牙名称&#xff0c;会为空&#xff0c;只有点击到设置蓝牙中查看后&#xff0c;该接口才能…

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

文章目录 前言&#x1f393;一、数据集准备&#x1f393;二、模型训练&#x1f340;&#x1f340;1.初始化&#x1f340;&#x1f340;2.加载数据集&#x1f340;&#x1f340;3.划分数据集&#xff0c;并保存到新的文件夹&#x1f340;&#x1f340;4.可视化数据集&#x1f34…

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境&#xff1a; keil版本为5.38&#xff0c;版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址&#xff1a;https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译&#xff0c;会报很多错&#xff0c;先不管。 二、更改头文件依赖 观察…

LuaRocks如何安装数据库驱动?

大家好&#xff0c;我是袁庭新。通过LuaRocks来安装数据库驱动如何实现呢&#xff1f;这篇文章帮你搞定。 LuaSQL是从Lua到DBMS的简单接口。LuaSQL它使Lua程序能够&#xff1a; 连接到ODBC、ADO、Oracle、MySQL、SQLite、Firebird和PostgreSQL数据库&#xff1b; 执行任意的S…