当前位置: 首页 > news >正文

每个.NET开发都应掌握的C#处理文件系统I/O知识点

上篇文章讲述了C#多线程知识点,本文将介绍C#处理文件的知识点。在.NET开发领域,文件系统I/O是一个至关重要的主题,尤其是在处理文件、目录和数据存储方面。C#作为.NET平台的主要编程语言,提供了丰富而强大的文件系统I/O功能,为开发人员提供了灵活的工具,使其能够高效地处理文件操作。本文将介绍C#处理文件系统I/O知识点。

1、文件和目录的创建与删除

在C#中,使用`File`和`Directory`类可以轻松地创建和删除文件及目录。开发者应了解如何使用这两个类的方法。

案例如下:

// 创建文件
File.Create("path/to/file.txt");
// 删除文件
File.Delete("path/to/file.txt");
// 创建目录
Directory.CreateDirectory("path/to/directory");// 删除目录
Directory.Delete("path/to/directory", true); // 第二个参数表示是否递归删除子目录和文件

2、文件读写操作

C#提供了强大的文件读写功能,开发者需要熟悉StreamReader和StreamWriter等类,以实现对文件的读写操作。下面是一个简单的例子:

// 读取文件内容
using (StreamReader reader = new StreamReader("path/to/file.txt"))
{string content = reader.ReadToEnd();Console.WriteLine(content);
}// 写入文件内容
using (StreamWriter writer = new StreamWriter("path/to/file.txt"))
{writer.WriteLine("Hello, C# File I/O!");
}

3、文件复制和移动

在处理文件时,复制和移动是常见的操作。C#提供了File.Copy和File.Move等方法,可以轻松实现文件的复制和移动:

// 复制文件
File.Copy("source/path/file.txt", "destination/path/file.txt");// 移动文件
File.Move("old/path/file.txt", "new/path/file.txt");

4、文件信息和属性

使用FileInfo类可以获取文件的详细信息和属性,例如文件大小、创建时间等:

FileInfo fileInfo = new FileInfo("path/to/file.txt");
Console.WriteLine($"File Size: {fileInfo.Length} bytes");
Console.WriteLine($"Creation Time: {fileInfo.CreationTime}");

5、目录遍历

了解如何遍历目录以获取文件列表是一个重要的技能。Directory类提供了GetFiles`和GetDirectories方法,可以返回指定目录下的文件和子目录。案例如下:

// 获取所有文件
string[] files = Directory.GetFiles("path/to/directory");// 获取所有子目录
string[] directories = Directory.GetDirectories("path/to/directory");

6、异常处理

在进行文件系统I/O操作时,处理可能发生的异常是不可或缺的。可能的异常包括文件不存在、权限不足等。使用try-catch块来捕获这些异常,以确保应用程序的稳定性。

try
{// 文件操作代码
}
catch (IOException ex)
{Console.WriteLine($"An IO exception occurred: {ex.Message}");
}
catch (UnauthorizedAccessException ex)
{Console.WriteLine($"Unauthorized access: {ex.Message}");
}

7、文件存在性检查

在C#可以使用File.Exists方法检查文件是否存在。

if (File.Exists("path/to/file.txt")){// 文件存在,执行相应操作}

8、路径操作

路径对于读取自定义配置文件等有非常重要的作用。在C#可以使用Path类来进行路径的合并、获取文件名等操作。

codestring fullPath = Path.Combine("folder", "subfolder", "file.txt");
string fileName = Path.GetFileName(fullPath);

9、异步文件读写

可以利用C#中的StreamReaderStreamWriter的异步方法,实现异步文件读写操作。

// 异步读取文件using (StreamReader reader = new StreamReader("path/to/file.txt")){    string content = await reader.ReadToEndAsync();    Console.WriteLine(content);}// 异步写入文件using (StreamWriter writer = new StreamWriter("path/to/file.txt")){    await writer.WriteLineAsync("Hello, C# File I/O!");}

10、 特殊文件夹路径获取

可以使用Environment.SpecialFolder枚举和Environment.GetFolderPath方法获取特殊文件夹的路径。下面案例是获取桌面文件路径。

string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);Console.WriteLine($"Desktop Path: {desktopPath}");

11、文件属性设置

使用File.SetAttributes方法设置文件属性,例如将文件设置为只读等。案例如下:

File.SetAttributes("path/to/file.txt", FileAttributes.ReadOnly);

12、文件锁定检查

大家常常会遇到文件锁定的问题不能读写文件,在C#中可以用以下方法检查文件是否被其他进程锁定。

private static bool IsFileLocked(string filePath){    try    {        using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))        {            // 文件未被锁定            return false;        }    }    catch (IOException)    {        // 文件被锁定        return true;    }}//调用bool isFileLocked = IsFileLocked("path/to/file.txt");
当然还有其它方法,见文章:《C#判断文件是否占用的2种方法》

13、文件流操

使用FileStream进行文件流操作,例如读取和写入文件。

using (FileStream fs = new FileStream("path/to/file.txt", FileMode.Open, FileAccess.Read)){    // 执行文件流操作}

14、监视文件变化

在C#中可以使用FileSystemWatcher类监视文件变化,例如文件内容的修改。

FileSystemWatcher watcher = new FileSystemWatcher("path/to/directory");watcher.EnableRaisingEvents = true;watcher.Changed += (sender, e) => Console.WriteLine($"File {e.FullPath} changed");

15、文件内容比较

怎么比较两个文件呢?可以使用File.ReadAllBytes方法转换成字节,然后用SequenceEqual方法来比较两个文件是否相同。案例如下:

//方法private static bool FileEquals(string filePath1, string filePath2){    byte[] file1 = File.ReadAllBytes(filePath1);    byte[] file2 = File.ReadAllBytes(filePath2);    return file1.SequenceEqual(file2);}//调用bool areFilesEqual = FileEquals("file1.txt", "file2.txt");

16、文件压缩与解压缩

在c#中可以使用ZipFile类进行文件压缩和解压缩操作,目前官方只支持zip文件。案例如下:

ZipFile.CreateFromDirectory("source/path", "archive.zip");ZipFile.ExtractToDirectory("archive.zip", "destination/path");

17、文件路径规范化(文件路径)

使用Path.GetFullPath方法规范化文件路径,解析相对路径等。在项目中可以获取完整路径。

string normalizedPath = Path.GetFullPath("path/to/../file.txt");

18、使用MemoryMappedFile进行内存映射文件操作

利用MemoryMappedFile进行大文件的内存映射操作,提高文件读写性能。

using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("path/to/file.txt")){    // 执行内存映射文件操作}

19、文件流异步操作

使用FileStream的异步方法进行文件流的异步读写操作。

using (FileStream fs = new FileStream("path/to/file.txt", FileMode.Open, FileAccess.Read)){    byte[] buffer = new byte[1024];    int bytesRead = await fs.ReadAsync(buffer, 0, buffer.Length);    // 处理读取的数据}

20、使用TransactionScope进行文件事务操作

使用TransactionScope进行多个文件操作的事务管理,确保一组文件操作要么全部成功,要么全部失败。

using (TransactionScope scope = new TransactionScope())
{File.Move("old/path/file.txt", "new/path/file.txt");// 其他事务操作scope.Complete();
}

结语

掌握这些C#文件系统I/O知识点对于.NET开发者来说是至关重要的。通过灵活运用这些知识,开发者能够更加高效地处理文件和目录,确保应用程序的可靠性和性能。在日常开发中,不断深入学习和实践这些知识,将有助于提高开发者的文件系统操作技能。

希望本文提供的C#文件系统I/O对每个.NET开发者都有所帮助,对于C#文件系统I/O你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、微软官网:learn.microsoft.com/zh-cn/dotnet/api/system.io.file

2、AI查询

1、每个.NET开发都应掌握的C#多线程知识点

2、每个.NET开发都应掌握的C#特性(Attribute)知识点

3、每个.NET开发都应掌握的C#反射知识点

4、每个.NET开发都应掌握的C#异常处理知识点

5、每个.NET开发都应掌握的C#集合知识点

6、每个.NET开发都应掌握的C#委托事件知识点

7、每个.NET开发都应掌握的C#接口知识点

8、每个.NET开发都应掌握的linq知识点

9、每个.NET开发都应掌握C#泛型的几个知识点

10、每个.NET开发都应该知道的10个.NET库

来源公众号:DotNet开发跳槽

相关文章:

每个.NET开发都应掌握的C#处理文件系统I/O知识点

上篇文章讲述了C#多线程知识点,本文将介绍C#处理文件的知识点。在.NET开发领域,文件系统I/O是一个至关重要的主题,尤其是在处理文件、目录和数据存储方面。C#作为.NET平台的主要编程语言,提供了丰富而强大的文件系统I/O功能&#…...

vue3 中使用 sse 最佳实践,封装工具

工具 // 接受参数 export interface SSEChatParams {url: string,// sse 连接onmessage: (event: MessageEvent) > void,// 处理消息的函数onopen: () > void,// 建立连接触发的事件finallyHandler: () > void,// 相当于 try_finally 中的 finally 部分,不…...

OpenCV快速入门【完结】:总目录——初窥计算机视觉

文章目录 前言目录1. OpenCV快速入门:初探2. OpenCV快速入门:像素操作和图像变换3. OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域4. OpenCV快速入门:图像滤波与边缘检测5. OpenCV快速入门:图像形态学操作6. OpenC…...

车企数据治理实践案例,实现数据生产、消费的闭环链路 | 数字化标杆

随着业务飞速发展,某汽车制造企业业务系统数量、复杂度和数据量都在呈几何级数的上涨,这就对于企业IT能力和IT架构模式的要求越来越高。加之企业大力发展数字化营销、新能源车等业务,希望通过持续优化客户体验,创造可持续发展的数…...

深入学习锁--Lock各种使用方法

一、什么是Lock Lock是一个接口,通常所说的可重入锁是指Lock的一个实现子类ReentrantLock 二、Lock实现步骤: ①创建锁对象Lock lock new ReentrantLock(); ②加锁lock.lock(); ③释放锁lock.unlock(); import java.util.concurrent.locks.Lock; import java.util…...

计算机毕设:基于机器学习的生物医学语音检测识别 附完整代码数据可直接运行

项目视频讲解: 基于机器学习的生物医学语音检测识别 完整代码数据可直接运行_哔哩哔哩_bilibili 运行效果图: 数据展示: 完整代码: #导入python的 numpy matplotlib pandas库 import pandas as pd import numpy as np import matplotlib.pyplot as plt #绘图 import se…...

VMware安装Ubuntu系统(Server端,Desktop端步骤一样)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Navicat 与 华为云 GaussDB 合作再升级,赋能 GaussDB 分布式数据库

2023 年第三季度,Navicat 首次支持了华为云 GaussDB 主备版数据库。经过双方团队进一步的深化合作,Navicat 完成了 GaussDB 分布式的研发适配工作,赋能 GaussDB 全域数据库产品。 GaussDB 数据库分为主备版和分布式版两种模式。主备版适用于…...

【Docker】从零开始:13.Docker安装tomcat

Docker】从零开始:13.Docker安装Tomcat 下载Tomcat镜像启动Tomcat镜像新版本Tomcat修改访问Tomact首页 下载Tomcat镜像 [rootdocker ~]# docker pull tomcat Using default tag: latest latest: Pulling from library/tomcat 0e29546d541c: Pull complete 9b829c7…...

风控规则引擎(一):Java 动态脚本

风控规则引擎(一):Java 动态脚本 日常场景 共享单车会根据微信分或者芝麻分来判断是否交押金汽车租赁公司也会根据微信分或者芝麻分来判断是否交押金在一些外卖 APP 都会提供根据你的信用等级来发放贷款产品金融 APP 中会根据很复杂规则来判…...

第五十六天|583. 两个字符串的删除操作 72. 编辑距离

583. 两个字符串的删除操作 可以求出最大子序列然后用字符串长度去减&#xff0c;也可以用删除的思路&#xff0c;如下&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size()1,vector<int…...

java中Lists.newArrayList和new ArrayList的详细区别?

下面是对Lists.newArrayList()和new ArrayList<>()的详细区别进行举例说明&#xff1a; 创建具有初始数据的列表&#xff1a; java Copy code import com.google.common.collect.Lists; List<String> list1 Lists.newArrayList("apple", "banana…...

从图片或PDF文件识别表格提取内容的简单库img2table

img2table是一个基于OpenCV 图像处理的用于 PDF 和图像的表识别和提取 Python库。由于其设计基于神经网络的解决方案&#xff0c;提供了一种实用且更轻便的替代方案&#xff0c;尤其是在 CPU 上使用时。 该库的特点&#xff1a; 识别图像和PDF文件中的表格&#xff0c;包括在表…...

CSV文件中使用insert 函数在指定列循环插入不同数据

文章目录 一、系统、工具要求二、需求三、代码实现&#xff1a;四、核心代码解读五、逐行更改某一列数据六&#xff1a;实现在文件的末尾增加指定内容列 一、系统、工具要求 pandaspythoncsv Windows 系统 二、需求 我有两个文件&#xff1a; 文件一&#xff1a;subject_ma…...

【华为OD题库-064】最小传输时延I-java

题目 某通信网络中有N个网络结点&#xff0c;用1到N进行标识。网络通过一个有向无环图.表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[]{u&#xff0c;v&#xff0c; w)&#xff0c;其中u表示源结点&#xff0c;v表示目的结点&#xff0…...

全文检索[ES系列] - 第495篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…...

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…...

C++软件在Win平台运行总结

Windows平台&#xff1a; 1.需要安装运行库&#xff1a;无论是exe还是动态库用的哪种平台工具集(visual2010-visual2019)进行编译&#xff0c;需要安装对应的运行时库vc_redist.x64.exe/vc_redist.x86.exe。比如Exe用的是VisualStdio2010工具集编译&#xff0c;其中链接的一个…...

【数电笔记】16-卡诺图绘制(逻辑函数的卡诺图化简)

目录 说明&#xff1a; 最小项卡诺图的组成 1. 相邻最小项 2. 卡诺图的组成 2.1 二变量卡诺图 2.2 三表变量卡诺图 2.3 四变量卡诺图 3. 卡诺图中的相邻项&#xff08;几何相邻&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并…...

前端面试灵魂提问(1)

1.自我介绍 2.在实习中&#xff0c;你负责那一模块 3.any与unknow的异同 相同点&#xff1a;any和unkonwn 可以接受任何值 不同点&#xff1a;any会丢掉类型限制&#xff0c;可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查&#xff0c;所以在使用一个…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...