C# IO文件操作

获得文件和文件夹信息

.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的构造函数需要提供四条信息:要操作的文件、打开文件的模式、访问文件的模式和文件共享的方式。

枚举
FileModeAppend、Create、CreateNew、Open、OpenOrCreate、Truncate
FileAccessRead、Write、ReadWrite
FileShareDelete、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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920848.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单实现QT对象的[json]序列化与反序列化

简单实现QT对象的[json]序列化与反序列化 简介应用场景qt元对象系统思路实现使用方式题外话 简介 众所周知json作为一种轻量级的数据交换格式&#xff0c;在开发中被广泛应用。因此如何方便的将对象数据转为json格式和从json格式中加载数据到对象中就变得尤为重要。 在python类…

Java开发经验——开发常用工具类

摘要 本文介绍了Java开发中常用的工具类&#xff0c;包括Apache Commons Collections的SetUtils、Google Guava的Sets、Apache Commons Lang的ArrayUtils等&#xff0c;以及它们在集合操作、数组操作、字符串处理、JSON处理等方面的应用。文章还涉及了Optional类、Money工具类…

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器

MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;旨在设备之间进行通信&#xff0c;尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1&#xff1a; 优点&#xff…

【IDE】使用指南

定期更新实用技能&#xff0c;建议关注收藏点赞。 友情链接&#xff1a; 点击跳转常见代码编辑器的报错解决方案 目录 常用快捷键pycharm右下角边栏脚本头安装IDE的插件git配置TODO 代码编辑器里有许多小技巧&#xff0c;便于办公。本篇主要以pycharm,vscode等主流常用IDE为…

OpenGL入门009——漫反射在片段着色器中的应用

本节将在片段着色器中应用漫反射 文章目录 一些概念漫反射 实战简介dependenciesshadervsshader.fs utilsCube.cpp main.cppCMakeLists.txt最终效果 一些概念 漫反射 概述&#xff1a; 描述的是粗糙表面对光的反射&#xff0c;反射的光线相关各个方向均匀分布&#xff0c;与视…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…

MySQL win安装 和 pymysql使用示例

目录 一、MySQL安装 下载压缩包&#xff1a; 编写配置文件&#xff1a; 配置环境变量&#xff1a; 初始化服务和账户 关闭mysql开机自启&#xff08;可选&#xff09; 建议找一个数据库可视化软件 二、使用pymysql操作数据库 安装pymysql 示例代码 报错处理 一、My…

springboot基于微信小程序的停车场管理系统

摘 要 停车场管理系统是一种基于移动端的应用程序&#xff0c;旨在方便车主停车的事务办理。该小程序提供了便捷的停车和功能&#xff0c;使车主能够快速完成各项必要的手续和信息填写。旨在提供一种便捷、高效的预约停车方式&#xff0c;减少停车手续的时间和精力成本。通过该…

js:数组转换为字符串

1、使用join 通过join&#xff0c;将数组拼接&#xff0c;使用&#xff0c;进行分割 let array [a, b, c] let str array.join(,); console.log(str) 2、使用toString() const array [a, b, c] const string array.toString() console.log(string) 3、使用扩展运算符和…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号&#xff0c;可在npm官网&#xff1a;https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口&#xff0c;常见命令如下&#xff1a; 1、登录命令&#xff1a;npm login&#xff08;不用每次都重新登录&#xff0…

路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决

上一路由tip信息框不销毁问题解决 路由缓存篇问题描述及截图解决思路关键代码 路由缓存篇 传送门 问题描述及截图 路由缓存后跳转新路由时&#xff0c;上一个路由的tip信息框没销毁。 解决思路 在全局路由守卫中获取DOM元素&#xff0c;通过css去控制 关键代码 修改文…

uni-app 界面TabBar中间大图标设置的两种方法

一、前言 最近写基于uni-app 写app项目的时候&#xff0c;底部导航栏 中间有一个固定的大图标&#xff0c;并且没有激活状态。这里记录下实现方案。效果如下&#xff08;党组织这个图标&#xff09;&#xff1a; 方法一&#xff1a;midButton的使用 官方文档&#xff1a;ta…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…

xiaolin coding 图解网络笔记——基础篇

基础篇 Linux 系统是如何收发网络包的&#xff1f; 网络模型 为了使多种设备能通过网络相互通信&#xff0c;和为了解决不同设备在网络互连中的兼容性问题&#xff0c;国际标准化组织制定了开放式系统互连通信参考模型&#xff08;Open System Interconnection Reference Mo…

【vba源码】导入excel批注信息

Hi&#xff0c;大家好呀&#xff01; 又到了一周一分享的时间&#xff0c;上周繁忙的我都没有给大家直播&#xff0c;视频也没更新&#xff0c;那这周大家放心&#xff0c;都会给大家更新&#xff0c;今天我们来讲点啥呢&#xff1f;每周找优质的内容给大家更新是我最最痛苦的…

跨平台WPF框架Avalonia教程 十三

AutoCompleteBox 自动补全输入框 自动补全输入框提供了一个供用户输入的文本框和一个包含可能匹配项的下拉列表。下拉列表会在用户开始输入时显示&#xff0c;并且每输入一个字符&#xff0c;匹配项都会更新。用户可以从下拉列表中选择匹配项。 文本与可能项匹配的方式是可配…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…

力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归法&#xff08;方法二更好理解&#xff0c;个人更习惯方法二&#xff09; 前中后序均可&#xff0c;实际上没有中的处理 中左右&#xff0c;左中右&#xff0c;左右中&#xff0c;实际上都是左在前&#xff0c;所以遇到的第一个…