翼度科技»论坛 编程开发 .net 查看内容

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

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
上篇文章讲述了C#多线程知识点,本文将介绍C#处理文件的知识点。在.NET开发领域,文件系统I/O是一个至关重要的主题,尤其是在处理文件、目录和数据存储方面。C#作为.NET平台的主要编程语言,提供了丰富而强大的文件系统I/O功能,为开发人员提供了灵活的工具,使其能够高效地处理文件操作。本文将介绍C#处理文件系统I/O知识点。
1、文件和目录的创建与删除
在C#中,使用`File`和`Directory`类可以轻松地创建和删除文件及目录。开发者应了解如何使用这两个类的方法。
案例如下:
  1. // 创建文件
  2. File.Create("path/to/file.txt");
  3. // 删除文件
  4. File.Delete("path/to/file.txt");
  5. // 创建目录
  6. Directory.CreateDirectory("path/to/directory");
  7. // 删除目录
  8. Directory.Delete("path/to/directory", true); // 第二个参数表示是否递归删除子目录和文件
复制代码
2、文件读写操作
C#提供了强大的文件读写功能,开发者需要熟悉StreamReader和StreamWriter等类,以实现对文件的读写操作。下面是一个简单的例子:
  1. // 读取文件内容
  2. using (StreamReader reader = new StreamReader("path/to/file.txt"))
  3. {
  4.     string content = reader.ReadToEnd();
  5.     Console.WriteLine(content);
  6. }
  7. // 写入文件内容
  8. using (StreamWriter writer = new StreamWriter("path/to/file.txt"))
  9. {
  10.     writer.WriteLine("Hello, C# File I/O!");
  11. }
复制代码
3、文件复制和移动
在处理文件时,复制和移动是常见的操作。C#提供了File.Copy和File.Move等方法,可以轻松实现文件的复制和移动:
  1. // 复制文件
  2. File.Copy("source/path/file.txt", "destination/path/file.txt");
  3. // 移动文件
  4. File.Move("old/path/file.txt", "new/path/file.txt");
复制代码
4、文件信息和属性
使用FileInfo类可以获取文件的详细信息和属性,例如文件大小、创建时间等:
  1. FileInfo fileInfo = new FileInfo("path/to/file.txt");
  2. Console.WriteLine($"File Size: {fileInfo.Length} bytes");
  3. Console.WriteLine($"Creation Time: {fileInfo.CreationTime}");
复制代码
5、目录遍历
了解如何遍历目录以获取文件列表是一个重要的技能。Directory类提供了GetFiles`和GetDirectories方法,可以返回指定目录下的文件和子目录。案例如下:
  1. // 获取所有文件
  2. string[] files = Directory.GetFiles("path/to/directory");
  3. // 获取所有子目录
  4. string[] directories = Directory.GetDirectories("path/to/directory");
复制代码
6、异常处理
在进行文件系统I/O操作时,处理可能发生的异常是不可或缺的。可能的异常包括文件不存在、权限不足等。使用try-catch块来捕获这些异常,以确保应用程序的稳定性。
  1. try
  2. {
  3.     // 文件操作代码
  4. }
  5. catch (IOException ex)
  6. {
  7.     Console.WriteLine($"An IO exception occurred: {ex.Message}");
  8. }
  9. catch (UnauthorizedAccessException ex)
  10. {
  11.     Console.WriteLine($"Unauthorized access: {ex.Message}");
  12. }
复制代码
7、文件存在性检查

在C#可以使用File.Exists方法检查文件是否存在。
  1. if (File.Exists("path/to/file.txt")){// 文件存在,执行相应操作}
复制代码
8、路径操作

路径对于读取自定义配置文件等有非常重要的作用。在C#可以使用Path类来进行路径的合并、获取文件名等操作。
  1. codestring fullPath = Path.Combine("folder", "subfolder", "file.txt");
  2. string fileName = Path.GetFileName(fullPath);
复制代码
9、异步文件读写

可以利用C#中的StreamReader和StreamWriter的异步方法,实现异步文件读写操作。
  1. // 异步读取文件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方法获取特殊文件夹的路径。下面案例是获取桌面文件路径。
  1. string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);Console.WriteLine($"Desktop Path: {desktopPath}");
复制代码
11、文件属性设置

使用File.SetAttributes方法设置文件属性,例如将文件设置为只读等。案例如下:
  1. File.SetAttributes("path/to/file.txt", FileAttributes.ReadOnly);
复制代码
12、文件锁定检查

大家常常会遇到文件锁定的问题不能读写文件,在C#中可以用以下方法检查文件是否被其他进程锁定。
  1. 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");
  2. 当然还有其它方法,见文章:《C#判断文件是否占用的2种方法》
复制代码
13、文件流操

使用FileStream进行文件流操作,例如读取和写入文件。
  1. using (FileStream fs = new FileStream("path/to/file.txt", FileMode.Open, FileAccess.Read)){    // 执行文件流操作}
复制代码
14、监视文件变化

在C#中可以使用FileSystemWatcher类监视文件变化,例如文件内容的修改。
  1. FileSystemWatcher watcher = new FileSystemWatcher("path/to/directory");watcher.EnableRaisingEvents = true;watcher.Changed += (sender, e) => Console.WriteLine($"File {e.FullPath} changed");
复制代码
15、文件内容比较

怎么比较两个文件呢?可以使用File.ReadAllBytes方法转换成字节,然后用SequenceEqual方法来比较两个文件是否相同。案例如下:
  1. //方法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文件。案例如下:
  1. ZipFile.CreateFromDirectory("source/path", "archive.zip");ZipFile.ExtractToDirectory("archive.zip", "destination/path");
复制代码
17、文件路径规范化(文件路径)

使用Path.GetFullPath方法规范化文件路径,解析相对路径等。在项目中可以获取完整路径。
  1. string normalizedPath = Path.GetFullPath("path/to/../file.txt");
复制代码
18、使用MemoryMappedFile进行内存映射文件操作

利用MemoryMappedFile进行大文件的内存映射操作,提高文件读写性能。
  1. using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("path/to/file.txt")){    // 执行内存映射文件操作}
复制代码
19、文件流异步操作

使用FileStream的异步方法进行文件流的异步读写操作。
  1. 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进行多个文件操作的事务管理,确保一组文件操作要么全部成功,要么全部失败。
  1. using (TransactionScope scope = new TransactionScope())
  2. {
  3.     File.Move("old/path/file.txt", "new/path/file.txt");
  4.     // 其他事务操作
  5.     scope.Complete();
  6. }
复制代码
  1. [/code][b]结语[/b]
  2. 掌握这些C#文件系统I/O知识点对于.NET开发者来说是至关重要的。通过灵活运用这些知识,开发者能够更加高效地处理文件和目录,确保应用程序的可靠性和性能。在日常开发中,不断深入学习和实践这些知识,将有助于提高开发者的文件系统操作技能。
  3. 希望本文提供的C#文件系统I/O对每个.NET开发者都有所帮助,对于C#文件系统I/O你还知道哪些?欢迎留言讨论或者吐槽本文。
  4. [b]参考:[/b]
  5. 1、微软官网:learn.microsoft.com/zh-cn/dotnet/api/system.io.file
  6. 2、AI查询
  7. 1、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650853718&idx=1&sn=858af6a4c219ce5d3f9991c1eaa2aa54&chksm=f1457cbec632f5a82c594a6ece9ff8ea09f0839bcc8c239df970337b7fa8c971123323fd0c40&scene=21#wechat_redirect]每个.NET开发都应掌握的C#多线程知识点[/url]
  8. 2、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650852870&idx=1&sn=08046f307f59db1a06c31d34e422e761&chksm=f14563eec632eaf88a728de3898589451f9985db2ab84f3de64106f3067fca423de5481202e1&scene=21#wechat_redirect]每个.NET开发都应掌握的C#特性(Attribute)知识点[/url]
  9. 3、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650852654&idx=1&sn=90d2372a58c5974c9e74f160b0ed85af&chksm=f14560c6c632e9d035711303e9f4b35fa8e76f8b6bb68c72eb35d420df79f07375ba177324b3&scene=21#wechat_redirect]每个.NET开发都应掌握的C#反射知识点[/url]
  10. 4、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650852340&idx=2&sn=e961125293c956b552b61a4c5a360e0d&chksm=f145661cc632ef0a827719235329d5e5a2ce0f6940dc718d34a49758ec6117b42aea345c8be9&scene=21#wechat_redirect]每个.NET开发都应掌握的C#异常处理知识点[/url]
  11. 5、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650851977&idx=1&sn=6d2aa7c47de17183024e210b8ac4d266&chksm=f1456761c632ee77aa48277c8d83161e4483b78ff3b060ae92bde47c483dab2e8c2f9ae003c0&scene=21#wechat_redirect]每个.NET开发都应掌握的C#集合知识点[/url]
  12. 6、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650851553&idx=1&sn=b1c601eaf4bb4f2898cbd418fa0ae426&chksm=f1456509c632ec1f8f512e5cafa72d4e40410d9ade97e3bb0a993184bcc8c49c0fbeccf6c063&scene=21#wechat_redirect]每个.NET开发都应掌握的C#委托事件知识点[/url]
  13. 7、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650851371&idx=1&sn=c630043f8d85816c660c53cbf6b3f218&chksm=f14565c3c632ecd5816f219ecb4bcd793dd4207c46613eded71fab9b720c5afeeadb98d1ef98&scene=21#wechat_redirect]每个.NET开发都应掌握的C#接口知识点[/url]
  14. 8、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650851239&idx=1&sn=bb917cb255f2cd3e7312b87559d35c92&chksm=f1456a4fc632e359cef85ee19e4a4f250ea044c3cbf760c94a80bbbab1ef5ca1ffeacf823142&scene=21#wechat_redirect]每个.NET开发都应掌握的linq知识点[/url]
  15. 9、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650851104&idx=1&sn=308c1dc6b6e14e4ea2681db34cad1426&chksm=f1456ac8c632e3de236ba80ed096ff2042fed1ca390e8cc47e8398231c41657c3b2dff30eef0&scene=21#wechat_redirect]每个.NET开发都应掌握C#泛型的几个知识点[/url]
  16. 10、[url=http://mp.weixin.qq.com/s?__biz=MzI2NDE1MDE1MQ==&mid=2650849584&idx=1&sn=0d0e2ca44c567ff40baea99f8d8bdb02&chksm=f1456cd8c632e5cea549197b6d94d8b69cfc7db1dfae1da063ba86140d4301d1f113337f81b8&scene=21#wechat_redirect]每个.NET开发都应该知道的10个.NET库[/url]
  17. [code]来源公众号:DotNet开发跳槽
复制代码
来源:https://www.cnblogs.com/xbhp/archive/2023/12/05/17876959.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具