前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 基础知识系列- 14 IO篇之 文件操作(01)

C# 基础知识系列- 14 IO篇之 文件操作(01)

作者头像
程序员小高
发布于 2020-05-04 06:53:13
发布于 2020-05-04 06:53:13
79300
代码可运行
举报
运行总次数:0
代码可运行

0. 前言

本章节是IO篇的第二集,我们在上一篇中介绍了C#中IO的基本概念和一些基本方法,接下来我们介绍一下操作文件的方法。在编程的世界中,操作文件是一个很重要的技能。

1. 文件、目录和路径

在开始操作之前,先大概讲解一下基本概念。在计算机系统中,文件是以硬盘为载体存储在计算机上的信息集合。文件通常会有一个后缀名,表示文件格式(当然,通常的另一个含义就是可能没有)。我们最常见到的图片文件,后缀有jpg/png/gif这些常见的;文本文件为txt等。

目录,不严谨的来讲可以用文件夹代替。不过严格来说,目录指的是文件所在的文件夹以及文件夹的位置这些信息的集合。

路径是指文件或文件夹所在的位置的字符串表示,有相对路径和绝对路径,有物理路径和网络路径等一系列这些划分。

  • 相对路径指的是,相对程序所在目录目标文件所在的目录路径
  • 绝对路径指的是从系统或者网站的目录起点开始文件所在的位置,也就是说无论程序在哪都能通过绝对路径访问到对应文件
  • 物理路径是指文件在磁盘的路径,划分依据与之前的两种并不一致,所以不是并列关系
  • 网络路径是指网络或文件是在网络服务上部署的,通过URI访问的路径信息

好了,基本概念介绍到这里,让我们来看看如何实现C#操作文件吧。

1.1 File和FileInfo

C# 提供了两个访问文件的入口,File和FileInfo这两个类。有人可能要迷惑了,为啥要提供两个呢,这两个又有啥子不一样的呢?别急,让我们来一起看一看吧。

我们先来观察一下两个类的声明方式有什么不一样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class File;
public sealed class FileInfo : System.IO.FileSystemInfo;

我们忽略突然冒出来的FileSystemInfo,只需要明白它是FileInfo的基类即可。

通过两个类的声明方式,可以看出File是一个工具类,而FileInfo则是文件对象。所以,File更多的用在快速操作文件并不需要长时间多次使用同一个文件的场景,而FileInfo则适合同一个文件的多次使用。

1.1.1 File工具类

我们先来看下File支持哪些操作:

a.文件读取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static byte[] ReadAllBytes (string path);
public static string[] ReadAllLines (string path);
public static string[] ReadAllLines (string path, System.Text.Encoding encoding);
public static string ReadAllText (string path);
public static string ReadAllText (string path, System.Text.Encoding encoding);
public static System.Collections.Generic.IEnumerable<string> ReadLines (string path);

先从名称上分析方法应该是什么,应该具有哪些功能?

  • ReadAllBytes以二进制的形式一次性把文件全部读出来
  • ReadAllLines打开文本文件,将文件内容一行一行的全部读出来并返回
  • ReadAllText打开文件,并将文件所有内容一次性读出来
  • ReadLines 这是一个新的方法,根据返回值和方法名称,可以判断它应该与ReadAllLines有着类似的行为

ReadLInes和ReadAllLines的区别:

  • ReadAllLines返回的是字符串数组,所以该方法会一次性将文件内容全部读出
  • ReadLines返回的是一个可枚举对象,根据之前在Linq系列和集合系列的知识,我们能判断出,这个方法不会立即返回数据

所以我们很轻易的就能得出,ReadAllLines不会过久的持有文件对象,但是不适合操作大文件;ReadLines对于大文件的操作更擅长一些,但是可能会更久的持有文件

b.写入文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void AppendAllLines (string path, System.Collections.Generic.IEnumerable<string> contents);
public static void AppendAllLines (string path, System.Collections.Generic.IEnumerable<string> contents, System.Text.Encoding encoding);
public static void AppendAllText (string path, string contents);
public static void AppendAllText (string path, string contents, System.Text.Encoding encoding);
public static void WriteAllBytes (string path, byte[] bytes);
public static void WriteAllLines (string path, string[] contents, System.Text.Encoding encoding);
public static void WriteAllText (string path, string contents);
public static void WriteAllText (string path, string contents, System.Text.Encoding encoding);

来,我们简单看一下这几个方法具体作用:

  • AppendAllLines:追加行到文件末尾
  • AppendAllText :将字符串内容追加到文件末尾
  • WriteBytes:将字节数组写到文件里,如果文件有内容就覆盖原有内容
  • WriteAllLines:按行写入文件中,如果文件有内容则覆盖原有内容
  • WriteAllText:将内容写入文件,如果文件有内容则覆盖原有内容

在使用File写入文件的时候,如果文件不存在则会自动创建文件。

c. 复制文件

File类提供了简单易用的复制文件功能,只需要指定源文件和新文件即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void Copy (string sourceFileName, string destFileName);
public static void Copy (string sourceFileName, string destFileName, bool overwrite);

这两个方法对的作用就是将 sourceFileName复制为destFileName。第一个方法不允许复制为已存在的文件,也就是说如果destFileName已存在则报错。第二个方法则通过overwrite指定是否覆盖。

d.移动文件

与复制文件相同的使用方式,File提供了移动文件的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void Move (string sourceFileName, string destFileName);
public static void Move (string sourceFileName, string destFileName, bool overwrite);

注意事项与复制文件一致。

e.删除文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void Delete (string path);

1.1.2 FileInfo 对象类

FileInfo提供了文件的创建、复制、删除、移动和打开等属性和实例方法。我们先来看看,如果创建一个FileInfo:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public FileInfo (string fileName);

通过指定文件路径,来换取一个FileInfo对象,如果fileName指定的是目录则会提示错误。

好,现在我们已经可以获取一个FileInfo对象实例了,那么一起来看看FileInfo支持哪些内容吧:

a. 先来看看文件的基本属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public override bool Exists { get; }

文件是否存在,等效于File.Existss(string path)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public string DirectoryName { get; }

获取文件所在目录的完整路径(绝对路径)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public System.IO.DirectoryInfo Directory { get; }

获取文件所在目录的目录类型实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public long Length { get; }

获取文件的大小,单位是字节。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public override string Name { get; }

获取文件名,包括文件的扩展名。

b. 文件的操作

对于FileInfo实例来说,对于文件的操作大多都是基于流来完成的(这部分请留意下一篇内容),这里先看一下它的实例方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public System.IO.StreamWriter AppendText ();//创建一个流适配器,在适配器里追加文本到文件中
public System.IO.FileInfo CopyTo (string destFileName);//将现有文件复制到新文件,并返回新文件的实例,不支持覆盖
public System.IO.FileInfo CopyTo (string destFileName, bool overwrite);//根据orverwrite确定是否覆盖
public System.IO.FileStream Create ();//创建当前对象代表的文件,并返回一个文件流
public System.IO.StreamWriter CreateText ();//与AppendText类似,但会覆盖文件原有内容
public override void Delete ();//删除文件
public void MoveTo (string destFileName);// 将文件移动到新文件,不支持覆盖已存在文件
public void MoveTo (string destFileName, bool overwrite);// 根据overwrite确定是否覆盖
public System.IO.FileStream Open (System.IO.FileMode mode);// 根据模式打开文件
public System.IO.FileStream Open (System.IO.FileMode mode, System.IO.FileAccess access);//指定权限和模式,打开文件
public System.IO.FileStream OpenRead ();//打开一个只能读取的文件流
public System.IO.StreamReader OpenText ();//打开一个读流适配器
public System.IO.FileStream OpenWrite ();// 打开一个只能写的流

最新版C#的API,取消了通过FileInfo获取文件的格式名的属性以及其他的很多属性,只保留了文中提到的几个属性。

1.2 Directory和DirectoryInfo

与之前的类似,Directory也是个工具类,DirectoryInfo则代表目录实例。

1.2.1 Directory

先来个简单的:

a. 创建目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static System.IO.DirectoryInfo CreateDirectory (string path);

如果目录已存在,则跳过创建,直接返回指定路径的DirectoryInfo实例

b.是否存在:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static bool Exists (string path);

返回是否存在这个目录。

c.返回目录下的所有文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static string[] GetFiles (string path);

d. 返回目录下的所有子目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static string[] GetDirectories (string path);

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 不做码农的开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
盘点:响应式布局的5种实现方式
响应式设计通过检测视口分辨率,针对不同客户端在客户端做代码处理,来展现不同的布局和内容;
艾编程
2022/12/01
2.4K0
盘点:响应式布局的5种实现方式
CSS&HTML面经专题——(四)移动端响应式布局
在移动端viewport视口(pc端没有这个概念)就是浏览器显示页面内容的屏幕区域。
玖柒的小窝
2021/10/26
2.6K0
移动端页面的自适应rem
具体来说,有的屏幕320px宽,有的屏幕640px宽,有的更宽,如果你写固定px,那么要么小的放不下,要么大的有大片空白。
javascript艺术
2021/05/28
2.5K0
移动端页面的自适应rem
Rem布局的原理解析
rem和em很容易混淆,其实两个都是css的单位,并且也都是相对单位,现有的em,css3才引入的rem,在介绍rem之前,我们先来了解下em。
闻说社
2022/07/08
1.3K0
Rem布局的原理解析
浅谈web自适应
随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置。移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样。这给我们在编写前端界面时增加了困难,适配问题在当下显得越来越突出。记得刚刚开始开发移动端产品的时候向设计MM要了不同屏幕的设计图,结果可想而知。本篇博文分享一些卤煮处理多屏幕自适应的经验,希望有益于诸君。
疯狂的技术宅
2019/03/28
1.4K0
浅谈web自适应
移动端布局攻略
作者:Tolonger 原文链接:https://www.jianshu.com/p/9e7e755ca281 除了百分比流式布局之外,rem布局占据了目前移动端布局的热潮。那么究竟这几种布局差别在哪里,对应的有什么效果,希望本文能给你一些有益的启示。除此之外还有响应式布局,固定宽度布局等。 百分比流式布局 这里面最知名的当属bootstrap框架的思路,他所有的组件以及模板ui均是百分比流式布局,单位为px.并且我们看到的大部分对移动端适配的页面也均是采用这种核心思想去做的,方法简单,多端共用,可以针对
前端教程
2018/03/05
1.5K0
移动端布局攻略
理解rem实现响应式布局原理及js动态计算rem「建议收藏」
  移动端布局中,童鞋们会使用到rem作为css单位进行不同手机屏幕大小上的适配。那么来讲讲rem在其中起的作用和如何动态设置rem的值。
全栈程序员站长
2022/07/20
7.7K0
响应式布局rem布局
第一步:从UI设计师拿到设计稿(psd) 640*1136 第二部:在样式中给HTML一个fontSize值,我们一般都给一个比较好算的值,比如:10px 100px... 在这里我们之所有用100px,主要是浏览器最小的字体大小都是12px,用10px比例会存在偏差
河湾欢儿
2018/09/06
2K0
响应式布局,你需要知道这些
https://juejin.cn/post/6951575591099301895
前端达人
2021/05/11
1.9K0
响应式或自适应布局的流派
(此图有可能名称反了,但不重要,我个人更偏向于 bootstrap 被叫作响应式的)
一起重学前端
2024/09/30
1870
Css-移动端适配总结 前言PC端Mobile总结参考&引用
工作以后,大部分的业务工作都是基于移动端H5的,开发过程中学习了很多东西,遇到过许多问题,诸如rem\em\css px\device px等,本文纯属个人的归纳总结,如有问题,请指出亲喷~
菜的黑人牙膏
2019/04/18
2.5K0
Css-移动端适配总结
		前言PC端Mobile总结参考&引用
浅谈-web屏幕适配的解决方案
就目前看来,web的屏幕适配是贯穿整个前端行业的,如常见的PC端,移动端,响应式,小程序等。
万少
2025/02/11
1430
浅谈-web屏幕适配的解决方案
ElementUI响应式布局bug、其中中el-col-sm-0会导致响应式布局失效的解决方法
如下布局,如果将:sm="0"则会导致456始终不显示 下面得响应式布局目的就是希望在sm也就是屏幕宽度在小于992px时将456隐藏,不显示,但是如果这样做就会出现bug
全栈程序员站长
2022/11/09
1.2K0
ElementUI响应式布局bug、其中中el-col-sm-0会导致响应式布局失效的解决方法
Web网页响应式布局.md
Q:什么是响应式布局? A:不管您的用户使用何种终端访问您的网站,都能够自动识别适应终端设备的分辨率以及宽度,让您的网站在众多设备中无缝浏览;响应式布局是就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本
全栈工程师修炼指南
2020/10/23
1.6K0
Web网页响应式布局.md
移动端WEB开发之响应式布局
原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化。
星辰_大海
2020/09/30
4.2K0
scrollWidth,clientWidth,offsetWidth的区别
网页可见区域宽:document.body.clientWidth; 网页可见区域高:document.body.clientHeight; 网页可见区域高:document.body.offsetWeight: 网页可见区域高:document.body.offsetHeight; 网页正文全文宽:document.body.scrollWidth; 网页正文全文高:document.body.scrollHeight; 网页被卷去的高:document.body.scrollTop; 网页被卷去的左:document.body.scrollLeft; 网页正文部分上:window.screenTop; 网页正文部分左:window.screenLeft; 屏幕分辨率的高:window.screen.height; 屏幕分辨率的宽:window.screen.width; 屏幕可用工作区高度:window.screen.availHeight; 屏幕可用工作区宽度:window.screen.availWidth;
全栈程序员站长
2022/09/16
2.4K0
scrollWidth,clientWidth,offsetWidth的区别
rem在响应式布局中的应用
最近做了一些响应式的页面,遇到了一些问题,想了些解决方法,在这里总结一下。目前响应式的主流实现方式是百分比布局,加上媒体查询@media screen。关于媒体查询还有媒体查询的一些兼容性问题,网上介绍的很多
用户9127725
2022/08/08
1.9K0
前端响应式布局为什么是个坑?
响应式设计:Responseive design,就是一个网站,一套代码能在所有终端能够正常展示,并不是为每个终端做一个特定版本,响应式是为解决移动互联网浏览器而诞生的。
呆呆
2021/09/30
9870
rem适配移动端的原理及应用场景
我们h5项目终端适配采用的是淘宝那套《Flexible实现手淘H5页面的终端适配》方案。主要原理是rem布局。最近和别人谈弹性布局原理,发现虽然已经使用了那套方案很久,但是自己对rem的理解很含糊, 包括vw、vh等。所以打算写博客总结一下,以加深理解。
前端老道
2022/03/29
1.8K0
rem适配移动端的原理及应用场景
响应式布局
原理:在不同屏幕下,通过媒体查询来改变布局容器的大小,再改变里面子元素的排列方式和大小,从而实现在不同大小的屏幕下,看到不同的页面布局和样式。
赤蓝紫
2023/01/01
3.1K0
响应式布局
相关推荐
盘点:响应式布局的5种实现方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档