C#学习笔记 文件操作

2023-11-01

获得文件和文件夹信息

.NET管理文件和文件夹信息的类有如下几个。

Directory和File类是两个静态类,可以静态地获取文件和文件夹的信息而无需实例化对象,这在只对某个文件或者文件夹执行一次操作的时候是很有用的。

Path也是一个静态类,为路径操作提供了各种方法。

DirectoryInfo和FileInfo类是两个可以实例化的类,在实例化的时候有一些开销,但是实例化之后对某个文件或文件夹进行大量操作的话就基本没有开销了。FileSystemInfo是它们共同的基类。

DriveInfo是一个与驱动器有关的类。

Directory和File类

Directory和File是两个静态类,当只对文件对象执行一次或几次操作的时候很有用。

这里先判断一下C:\Windows\System32\drivers\etc文件夹是否存在,然后遍历一下其中的内容,然后将hosts文件复制出来,最后查看一下复制出来的hosts文件的属性。

const string hostsFolder = @"C:\Windows\System32\drivers\etc";

Console.WriteLine("检查文件夹是否存在");
Console.WriteLine($"{Directory.Exists(hostsFolder)}");

Console.WriteLine("遍历文件夹中的文件");
new List<string>(Directory.EnumerateFiles(hostsFolder)).ForEach((f) => Console.WriteLine(f));

Console.WriteLine($"复制并获得文件的信息");
string localHostsPath = Path.Combine(Directory.GetCurrentDirectory(), "hosts");

File.Copy(Path.Combine(hostsFolder, "hosts"), localHostsPath, true);

Console.WriteLine($"文件创建时间:{File.GetCreationTime(localHostsPath)}");
Console.WriteLine($"文件最后修改时间:{File.GetLastWriteTime(localHostsPath)}");

FileInfo和DirectoryInfo类

和File、Directory类类似,只不过这两个类需要使用文件对象来实例化。实例化之后,对其进行大量的操作就很方便了。

这里将上面的例子简单地改写了一下。

Console.WriteLine("用DirectoryInfo遍历文件夹的内容");
DirectoryInfo programFiles = new DirectoryInfo(@"C:\Program Files");
new List<FileSystemInfo>(programFiles.GetFileSystemInfos()).ForEach((e) => Console.WriteLine($"文件或文件夹名:{e}"));

Console.WriteLine("");
FileInfo hosts = new FileInfo(@"C:\Windows\System32\drivers\etc\hosts");
Console.WriteLine($"hosts全名:{hosts.FullName}, hosts扩展名:{hosts.Extension}");

Path类

Path类用来执行一些和路径相关的操作,也是一个静态类。

Console.WriteLine();
Console.WriteLine($"目录分隔符:{Path.DirectorySeparatorChar}");
Console.WriteLine($"环境变量分隔符:{Path.PathSeparator}");
Console.WriteLine($"容量分隔符:{Path.VolumeSeparatorChar}");
Console.WriteLine($@"C:\Windows和System连接的结果是:{Path.Combine(@"C:\Windows", "System")}");

DriveInfo类

DriveInfo类可以查看驱动器的相关信息。

DriveInfo c = new DriveInfo("C");
Console.WriteLine("查看驱动器信息\n");
Console.WriteLine($"可用空闲空间:{c.AvailableFreeSpace / Math.Pow(1024, 3)}");
Console.WriteLine($"驱动器格式:{c.DriveFormat}");
Console.WriteLine($"驱动器类型:{c.DriveType}");
Console.WriteLine($"驱动器名称{c.Name}");
Console.WriteLine($"驱动器卷标:{c.VolumeLabel}");
Console.WriteLine($"驱动器总可用空闲空间:{c.TotalFreeSpace / Math.Pow(1024, 3)}");

读写文件

利用File类的扩展方法

File类扩展了几个方法,可以轻松地读写文件,具体有6个方法,分别是ReadAllText方法、ReadAllLines方法、ReadAllBytes方法、WriteAllText方法、WriteAllLines方法和、WriteAllBytes方法。从名字很容易看出来这六个方法的用法。需要注意的是,三个写方法都会覆盖原来的版本,所以如果要实现追加文本内容,就不能用这三个方法。

以下是一个简单的例子,先读取了一下hosts文件的内容(ReadAllText方法),然后利用LINQ和ReadAllLines方法选出注释行(以#开头的行),最后用ReadAllBytes看了一下文件的字节流形式。写入文件也一样简单。

Console.WriteLine("显示hosts文件的部分内容");
const string hosts = @"C:\Windows\System32\drivers\etc\hosts";
Console.WriteLine(File.ReadAllText(hosts).Substring(0, 10));
Console.WriteLine("只显示注释行的前十行");
string[] lines = File.ReadAllLines(hosts);
var comments = from line in lines
               where line.StartsWith("#")
               select line;
foreach (var comment in comments.Take(10))
{
    Console.WriteLine(comment);
}
Console.WriteLine("读取hosts文件的前20个字节");
byte[] bytes = File.ReadAllBytes(hosts);
for (int i = 0; i < Math.Min(20, bytes.Length); ++i)
{
    Console.Write(bytes[i]);
}
Console.WriteLine();
const string testFile = "text.txt";
string testString = "123,这是一段测试字符串";
File.WriteAllText(testFile, testString);
Console.WriteLine();

流是一种抽象,表示一组信息的顺序集合。流可以是磁盘上的文件,也可以是网络上传过来的数据,或者是内存上的一段区域。

FileStream类

FileStream可以用来读取和写入二进制数据,具体一些就是字节流

FileStream的构造函数需要提供四条信息:要操作的文件、打开文件的模式、访问文件的模式和文件共享的方式。

枚举
FileMode Append、Create、CreateNew、Open、OpenOrCreate、Truncate
FileAccess Read、Write、ReadWrite
FileShare Delete、Inheritable、None、Read、Write、ReadWrite

打开文件的模式定义了打开文件的方式,是追加、创建还是打开等等。如果文件的状态和打开文件的模式不匹配,就会发生异常。比如如果文件不存在,追加和打开的模式就会抛出异常。如果文件存在,创建新文件的模式就会抛出异常。

访问文件的方式定义了应该如何访问文件,是读取、写入还是二者都有。

文件共享的方式定义了当一个进程已经占有了文件的时候,另一个进程应该如何访问文件。

FileStream既可以直接从构造函数中创建,也可以由一个FileInfo对象创建。相应的,FileInfo中也有对应的Create方法和Open方法,用来创建对应的文件流。

获得文件流之后,就可以读写数据了。ReadByte方法用于读取一个字节,如果已经到文件的末尾,就会返回-1。Read方法则需要一个缓冲区,并提供起始的位置和要读取的字节数。对应的还有Write和WriteByte方法。

最后不要忘了在使用完文件流对象之后将其关闭。

Console.WriteLine("文件测试:\n");
//不同的方式打开文件流
FileStream testFile = new FileStream("test.txt", FileMode.Create, FileAccess.ReadWrite);
//FileStream testFile2 = new FileInfo("text2.txt").Open(FileMode.OpenOrCreate, FileAccess.ReadWrite);
//写文件
testFile.WriteByte(50);
testFile.Write(new byte[] { 10, 20, 30, 40 }, 0, 4);
testFile.Close();
//读文件
testFile = new FileInfo("test.txt").OpenRead();
byte[] buffer = new byte[testFile.Length];
testFile.Read(buffer, 0, buffer.Length);
new List<byte>(buffer).ForEach((e) => Console.Write(e));
testFile.Close();

StreamReader和StreamWriter

StreamReader和StreamWriter用来进行文本文件的读取和写入。在构造StreamReader和StreamWriter的时候,可以直接用一个文件名来构造,也可以用FileInfo对象或者是FileStream对象来构造,使用后者的好处是可以用FileAccess和FileMode更精细地控制文件的读写权限。

另外,还可以在构造字符流的时候设定其编码,编码是System.Text.Encoding类的几个属性之一,可以是ASCII、Unicode、UTF7、UTF8、UTF32等等值。根据MSDN的介绍,Unicode就是小端编码UTF16。

获取到了字符流对象之后,就可以对其进行读写操作了。有Read、Write、ReadLine、WriteLine等多个方法,它们为不同的参数重载了多个版本,可以满足各种各样的需求。注意在流使用完之后需要关闭。

Console.WriteLine("\n字符流读写测试:\n");
StreamWriter outFile = new StreamWriter("test.txt");
outFile.WriteLine("This is a file");
outFile.WriteLine(DateTime.Now.ToShortDateString());
outFile.Close();
StreamReader inFile = new StreamReader("test.txt");
new List<string>(inFile.ReadToEnd().Split('\n')).ForEach((e) => Console.WriteLine(e));
inFile.Close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#学习笔记 文件操作 的相关文章

随机推荐

  • linux把一个文件和子目录下面的内容改为所有用户可读写执行

    要将一个文件和子目录下的内容设置为所有用户可读 写和执行权限 可以使用chmod命令 假设您要修改的文件和子目录所在的路径为 path to file or directory 可以运行以下命令 chmod R 777 path to fi
  • 虚拟机安装linux系统,重启后无法联网

    虚拟机安装linux系统 重启后无法联网 使用环境 触发问题 临时解决问题 使用环境 manjaro 18 deepin15 8 fedoras 29 等 有nmcli网络套件管理 无法使用systemctl restart network
  • 尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅),笔记

    项目资料 前端资料 https gitee com jch1011 shangpinhui 0415 后台资料 https gitee com jch1011 guigu B站直达 https www bilibili com video
  • 保研之路——上交大电子系直博

    上交大电子系直博 个人情况 高校复试参与情况 上交电子系直博 6 15 结语 嗯 抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴 希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给我发了邀请我就去 除了时间冲突的情况 事实证明 我
  • HITiCS大作业——程序人生

    计算机系统 大作业 题 目 程序人生 Hello s P2P 专 业 计算机科学与技术 学 号 2021112155 班 级 2103103 学 生 谷佳熠 指 导 教 师 刘宏伟 计算机科学与技术学院 2022年11月 摘 要 本篇文章详
  • springboot定时任务详解

    文章目录 一 基于注解 静态 1 添加依赖 2 创建定时任务 3 参数说明 二 基于接口 动态 1 添加依赖 2 添加数据库记录 3 创建定时器 4 启动测试 三 Quartz 1 添加依赖 2 编写任务类 3 编写配置类 4 启动项目 在
  • MySQL数据库的性能优化----(一步一个脚印)

    一 MySQL数据库的优化目标 基本原则 1 优化目标 MySQL数据库是常见的两个瓶颈是CPU和I O的瓶颈 无论是索引优化 还是表结构优化 参数优化 最后都可以归纳到这这两个分类中 1 减少 I O 次数 I O是数据库最容易瓶颈的地方
  • Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Function问题解决

    场景 java eclipse 调用问题 java eclipse selenium3 脚本 gt package LoginScript import org openqa selenium import org openqa selen
  • MySQL数据库多列索引详解

    多列索引的概念 多列索引 是指在创建索引时所关联的字段不是一个字段 而是多个字段 虽然可以通过所关联的字段进行查询 但是只有查询条件中使用了所关联字段中的第一个字段 多列索引才会被使用 多列索引的创建 创建表时定义索引 语法 CREATE
  • UE4蓝图:初体验(4)循环

    在C 中循环的关键字有for while do while三种 而在蓝图中 1 For循环 1 在蓝图中 右键输入for loop 获得ForLoop节点 该节点左边的按钮分别是循环计数的初始值和终止值 图中的是指从1 4共循环4次 右边的
  • eclipse中出现红线错误但不提示错误信息解决办法

    eclipse中出现红线报错 但鼠标悬停不提示错误信息 如图例 经过摸索找到了其中的解决方案 这主要与Hovers 的设置相关 通过如下设置修改 Window gt Preferences gt Java gt Editor gt Hove
  • AIX mount RedHat的NFS

    AIX mount RedHat的NFS RedHat 192 168 8 202 AIX 192 168 8 193 在RedHat服务器上设置NFS服务 1 RedHat服务器端的设定NFS都是在 etc exports这个文件中进行设
  • 敏捷运维

    序言 表面上都是自由的 实际上四周围墙 无法跨越 表面上都有很多选择 实际上没得选 成功是一种考验 失败也是 原因能想出来吗 敏捷运维 敏捷开发 在各种压力进行运维 有一定的适合场景 你知道么 风言风语 运维到底根据什么样的节奏走 是快一点
  • 【C语言】- printf 和scanf 函数详解!

    一 printf函数 这是在stdio h中声明的一个函数 因此使用前必须加入 include
  • 时序预测方法总结

    时序预测 本人博客只是平时学习中做的笔记 若文中有错误请大家指出 一 单变量时间预测 1 AR AutoRegression 自回归 自回归基于输入变量的线性组合为输出建模 输入 先前时间步长的值 输出 下一步的值 在时间序列中 鉴于当前和
  • 关于unity3d分享功能之ShareSDK的研究续二

    关于微信分享 前面的博客也是提到了 总有一下问题 有些注意的事项再一次总结一下 注意一 微信需要开发者认证审核通过app 这个时候会有AppID和AppSecret 把这个在脚本ShareSDKDevInfo cs中替换掉 注意在面板中一样
  • 学习QT的意义以及QT平台的安装

    文章目录 前言 一 为什么要学习QT 1 学习Qt的意义 2 Qt的一些应用案例 二 Qt软件的安装 1 Qt的下载 2 具体安装环节 总结 前言 Qt 是一个1991年由Qt Company开发的跨平台C 图形用户界面应用程序开发框架 它
  • 【分析】string中size与length

    结论 没有区别 length是因为沿用C语言的习惯而保留下来的 string类最初只有length 引入STL之后 为了兼容又加入了size 它是作为STL容器的属性存在的 便于符合STL的接口规则 以便用于STL的算法 具体解释 cplu
  • Nreal for Unity SDK 发布安卓参数设置

    Getting Started with NRSDK NRSDK 原文链接 Quickstart for Android NRSDK 1 7 0 documentationhttps nrealsdkdoc readthedocs io e
  • C#学习笔记 文件操作

    获得文件和文件夹信息 NET管理文件和文件夹信息的类有如下几个 Directory和File类是两个静态类 可以静态地获取文件和文件夹的信息而无需实例化对象 这在只对某个文件或者文件夹执行一次操作的时候是很有用的 Path也是一个静态类 为