C#文件读写

2023-11-12

C#的IO类库提供了丰富的IO操作,下面我来总结一下其IO类库提供的一些操作文件系统的方法

一.操作驱动器
C#用DriveInfo来操作驱动器
1.创建对象
a.我们可以通过静态方法DriveInfo.GetDrives()来获取所有的Driver。
b.可以以Drive Letter为参数新建DriveInfo对象,注意DNS路径不能作为参数。
c.此外,我们还可以通过Directory.GetLogicalDrives()先获取机器上所有Driver的Driver letter,再用它新建DriveInfo对象以操作所有的Driver。

2.获取驱动器的状态
我们通过DriveInfo对象来获取驱动器的状态,可以获取的状态有
AvailableFreeSpace:获取当前用户被分配的可用空间大小(bytes)
TotalFreeSpace:获取所有可用空间大小(bytes)
TotalSize:获取总大小(bytes)
DriveFormat:返回FAT, NTFS等值
DriveType:返回DriveType类型的Enum值,可以是CDRom, Fixed, Network, NoRootDirectory, Ram, Removable,或者Unknown
IsReady:对Removable和CD-ROM来说只有相应的设备可以访问了才返回true,当该属性为false时,很多其他属性无法获取
Name:盘符名
RootDirectory:返回Driver所代表的路径的Directory对象。
VolumeLabel:返回VolumeLabel信息,VolumeLabel就是咱自己对盘符定义的名字

二.操作文件夹
C#提供了DirectoryInfo和Directory两个类来操作文件夹,这两个类提供了很多相同的方法,他们的区别在于DirectoryInfo是先构造一个文件夹对象,再对这个对象进行操作。而Directory提供的大多数都是静态函数,这样能够直接根据给定的文件夹路径进行相应的操作。在对文件夹进行多个操作时最好用DirectoryInfo,而只进行一个操作,最好用Directory。
1.构造对象
DirectoryInfo需要先构造文件夹对象,再获取文件夹属性,或者对文件夹进行操作。它的构造方法不负责判断路径是否存在。
Directory不需要构造文件夹对象,直接传入文件夹的路径进行操作

2.判断文件夹是否存在
DirectoryInfo对象可通过查看Exists属性查看文件夹是否存在
Directory可通过Exists方法查看文件夹是否存在

3.获取文件夹属性
注意,在用DirectoryInfo和Directory类获取文件夹属性前最好先判断其是否存在
对DirectoryInfo对象,在获取文件夹属性前应先用refresh函数刷新,可以访问文件夹的下列属性:
Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值
CreationTime
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc

Directory也可获取上述属性,不过是用静态函数获取,另外Directory也不支持获取Attribute。
SetCreationTime 
SetCreationTimeUtc 
SetLastAccessTime 
SetLastAccessTimeUtc 
SetLastWriteTime 
SetLastWriteTimeUtc 
GetCreationTime 
GetCreationTimeUtc 
GetLastAccessTime 
GetLastAccessTimeUtc 
GetLastWriteTime 
GetLastWriteTimeUtc

4.路径操作
DirectoryInfo和Directory类都支持路径操作,这些操作只针对传入的路径字符串,和文件夹是否存在无关
DirectoryInfo有下面一些属性
Name
Extension
FullName
Parent
Root

Directory有下面一些方法
GetParent:获取父目录的DirectoryInfo对象
GetDirectoryRoot

5.新建,移动,删除文件夹
DirectoryInfo和Directory类都支持文件夹的新建,移动,删除
DirectoryInfo的方法
Create,CreateSubdirectory,Delete,MoveTo

Directory的方法
CreateDirectory 
Delete   
Move

6.遍历文件夹下的内容
DirectoryInfo和Directory类都支持遍历文件夹下的内容,而且都支持通过传入searchpattern和searchOption来定义遍历的行为,对于searchpattern,*匹配一个或多个字符,?匹配一个字符。searchOption的值是TopDirectory或AllDirectories,用来控制匹配的时候要不要包括子目录。
DirectoryInfo的方法:
EnumerateDirectories
EnumerateFiles
EnumerateFileSystemInfos
GetDirectories
GetFiles
GetFileSystemInfos

Directory的方法
GetDirectories 
GetFiles 
GetFileSystemEntries
EnumerateDirectories 
EnumerateFiles 
EnumerateFileSystemEntries

7.获取和设置当前的工作路径
Directory有两个重要的方法:
GetCurrentDirectory:获取当前的工作路径
SetCurrentDirectory:设置当前的工作路径

三.操作文件
C#提供了FileInfo和File两个类来操作文件,这两个类提供了很多相同的方法,他们的区别在于FileInfo是先构造一个文件对象,再对这个对象进行操作。而File提供的大多数都是静态函数,这样能够直接根据给定的文件路径进行相应的操作。在对文件进行多个操作时最好用FileInfo,而只进行一个操作,最好用File。
1.构造对象
FileInfo需要先构造文件对象,再获取文件属性,或者对文件进行操作。它的构造方法不负责判断路径是否存在。
File不需要构造文件对象,直接传入文件的路径进行操作

2.判断文件是否存在
FileInfo对象可通过查看Exists属性查看文件是否存在
File可通过Exists方法查看文件是否存在

3.获取文件属性
注意,在用FileInfo和File类获取文件属性前最好先判断其是否存在
对FileInfo对象,在获取文件属性前应先用refresh函数刷新,可以访问文件的下列属性:
Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值
CreationTime
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc
Length:文件大小
IsReadOnly


File也可获取上述属性,不过是用静态函数获取
GetAttributes 
SetAttributes 
SetCreationTime 
SetCreationTimeUtc 
SetLastAccessTime 
SetLastAccessTimeUtc 
SetLastWriteTime 
SetLastWriteTimeUtc 
GetCreationTime 
GetCreationTimeUtc 
GetLastAccessTime 
GetLastAccessTimeUtc 
GetLastWriteTime 
GetLastWriteTimeUtc

4.路径操作
FileInfo提供了一些路径操作,这些操作只针对传入的路径字符串,和文件是否存在无关
FileInfo有下面一些属性
Name
Extension
FullName
Directory:返回DirectoryInfo对象
DirectoryName 
Parent
Root

5.新建,移动,删除文件
FileInfo和File类都提供了新建,移动,删除文件操作
FileInfo的方法:
CopyTo
Create
Delete
MoveTo
Replace

File的方法
Copy 
Create
Delete 
Move 
Replace

6.加密解密文件
FileInfo和File类都提供了Encrypt和Decrypt方法用来加密和解密文件,用某个用户加密的文件只有同一个用户能解密

四.监听文件夹
C#有个很有趣的类,FileSystemWatcher,这个类可以用来监听文件夹内文件的增加,删除,修改等事件。
1.定制监听的信息
通过设置FileSystemWatcher的一些属性来定制监听的信息
Path:监听的目录
NotifyFilter:用来设置对哪些类型的更改进行监视
监视的类型为FileName,DirectoryName,Attributes,Size,LastWrite,LastAccess,CreationTime,Security的或值。默认为LastWrite, FileName, DirectoryName的或值
InternalBufferSize:内部缓存区的大小,默认8KB,最小4KB,最大64KB
Filter:可以用通配符过滤文件,*匹配一个或多个字符,?匹配一个字符
IncludeSubdirectories:是否监听子目录

2.定制事件发生后的行为
文件夹里会发生下述事件
Changed
Created
Deleted
Renamed
我们通过给这些事件加事件处理器来处理事件
另外还可以用WaitForChanged来监听某个指定类型的消息然后返回

3.启动监听
只有当EnableRaisingEvents为true且Path有值时,才能监听成功,当我们将所有信息设置好后,就可以通过设置这个值启动和停止监听了

4.用BeginInit和EndInit来阻止component在初始化完成前使用,一般将一系列的操作写在这两个函数之间。

5.在Form中定义的时候必须将Form控件赋给SynchronizingObject属性

6.简单的示例:

监听"C:\jingle"文件夹下面所有文件和文件夹的重命名操作

 [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = "c:\\jingle";
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.IncludeSubdirectories = true;
        watcher.Filter = "*.*";

        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        watcher.EnableRaisingEvents = true;

        Console.Read();
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }

我们能够利用C#的IO库进行文件,文本的读写操作,一般的操作是先打开文件,进行读写操作,再关闭文件。其中打开文件的操作可以通过FileInfo对象进行,也可以通过File类进行,但是更常用和方便的是用File类进行,所以本文将只介绍用File类打开文件的方法。

一.文件的简单读写操作
如果你只想打开文件简单的读写,File类提供了一些函数能够一条语句就完成打开文件,读或写,关闭文件等操作:
1.读取文件内容
下面的方法都将先打开文件,读取并关闭文件,文件不存在将会报错
ReadAllBytes:以字节数组byte[]的形式获取文件内容
ReadAllLines:以字符串数组string[]的形式获取文件内容,可以指定编码形式,如果不指定编码,将尝试自动检测文件的编码
ReadAllText: 以字符串string的形式获取文件内容,可以指定编码形式,如果不指定编码,将尝试自动检测文件的编码
ReadLines:返回IEnumerable<string>形式的字符串数组,这样可以用如下的方式一行行的访问文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码
foreach (string line in File.ReadLines(@"c:\jingle\test.txt"))
{
  Console.WriteLine(line);
}

2.写入文件内容
下面的方法都将先新建文件并打开,写入并关闭文件,如果文件存在将覆盖原文件
WriteAllBytes:以字节数组byte[]的形式写入文件内容
WriteAllLines:以字符串数组string[]或IEnumerable<string>的形式写入文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码
WriteAllText:以字符串string的形式获取文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码

3.添加文件内容
下面的方法都将先打开文件,添加内容并关闭文件,文件不存在将会新建文件
AppendAllLines:以字符串数组string[]或IEnumerable<string>的形式写入文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码
AppendAllText:以字符串string的形式获取文件内容,可以指定编码形式,如果不指定编码,将使用UTF-8编码

二.用FileStream操作文本内容
FileStream继承自Stream
1.创建FileStream
File类提供了一些将文件打开成FileStream的函数
public static FileStream Open(
 string path
 FileMode mode,
 FileAccess access,
 FileShare share
)
mode可以为Open,Create,append,
access可以为Read, Write, 或ReadWrite
share,文件可以用以下几种共享模式打开:
a.None:不管文件以什么权限打开,在关闭文件前都不能再打开
b.Read:当文件打开时,只能以读的权限再次打开
c.Write:当文件打开时,只能以写的权限再次打开
d.ReadWrite:当文件打开时,还可以以写或读的权限再次打开

public static FileStream Create(
 string path,
 int bufferSize,
 FileOptions options,
 FileSecurity fileSecurity
)
options的值可以为以下选项的或值
a.None
b.WriteThrough 表明写的内容不用缓存,直接存入文件 
c.Asynchronous 表明文件可异步读写
d.RandomAccess 表明文件可以随机访问
e.DeleteOnClose 表明文件不使用后会自动删除
f.SequentialScan 表明文件只能顺序访问,在读很大的文件时能提高效率
g.Encrypted 表明文件被加密

OpenRead:
等价于Open(path, FileMode.Open,FileAccess.Read,FileShare.Read)

OpenWrite:
等价于Open(path, FileMode.OpenOrCreate,FileAccess.Write,FileShare.None)

另外还可以直接新建FileStream。

2.读写操作
可使用CopyTo,Read,Write,writebyte等函数写入字节数组.
写入后用Flush函数清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。
如果想要撤销某些写入的数据,可以使用SetLength函数

3.定位
用Seek(
 long offset,
 SeekOrigin origin
)
函数来进行定位。
用origin来表明查找的起始位置是在文件头,文件尾,还是当前位置。
offset是相对于origin位置的便宜。

用Position直接定位

4.判断是否读到文件尾
通过比较Length和Position属性来判断是否是文件尾

5.异步读写
当操作的文本太大,需要进行异步读写以提高性能
要进行异步读写,首先文本需要用异步的方式打开
a.可使用 FileStream(String, FileMode, FileAccess, FileShare, Int32, Boolean) 函数,以异步方式打开
b.可通过设置FileOptions参数,以异步方式打开

有的平台不支持异步打开,所以我们可以用IsAsync属性判断是否成功异步打开了。

从.NET Framework 4.5开始支持用CopyToAsync,ReadAsync,WriteAsync,FlushAsync来进行异步读写。

.NET Framework 4.5之前用BeginRead,BeginWrite,EndRead,EndWrite函数来进行异步读写。


三.用StreamReader读文件
StreamReader继承自TextReader
1.创建StreamReader
a.使用File.OpenText函数以UTF-8编码打开并返回StreamReader对象
b.用Stream创建StreamReader对象,这种创建方法让我们能方便的读取其他的Stream对象。
c.用文件路径创建StreamReader对象

2.读操作
Read():读一个字符。 
Read(Char[], Int32, Int32):从当前流中将指定的最多个字符读到指定索引位置开始的缓冲区。 
ReadBlock:Read的block版本
ReadLine:读取一行字符
ReadToEnd:读所有字符

3.预读
在文本处理中经常希望预先知道下面要读的内容,StreamReader提供了两个很有用的函数
EndOfStream判断是否是文件尾
Peek返回下一个字符,但是不改变当前位置,如果没有要读取的字符或该流不支持查找,则为-1

4.定位
用BaseStream返回基本流来进行定位
但是如果已经进行了读取操作,内部缓冲区和BaseStream的位置不一致,这时需要用DiscardBufferedData函数来令两者一致后再进行定位。
reader.DiscardBufferedData();
reader.BaseStream.Location = 8;

5.异步读
从.NET Framework 4.5开始支持用ReadAsync,ReadBlockAsync,ReadLineAsync,ReadToEndAsync来进行异步读。

四.用StreamWriter写文件
1.创建StreamWriter
a.使用File.AppendText函数以UTF-8编码打开并返回StreamWriter对象
b.使用File.CreateText函数以UTF-8编码打开并返回StreamWriter对象
c.用Stream创建StreamWriter对象,这种创建方法让我们能方便的写入其他的Stream对象。
d.用文件路径创建StreamWriter对象

2.写操作
a.支持用Write和WriteLine函数直接写入Boolean,Decimal,Double,Int32,Int64,UInt32,UInt64,Single,Char,Object,Char[],String等数据
b.支持用Write和WriteLine函数格式化写内容,格式化参见http://msdn.microsoft.com/zh-cn/library/26etazsy.aspx
c.写入后用Flush函数清除该流的所有缓冲区,并使得所有缓冲数据被写入到基础设备。如果将AutoFlush属性设为true,则能自动Flush

3.定义行结束符
我们可以用NewLine属性来定义自己想要的行结束符

4.异步写
从.NET Framework 4.5开始支持用WriteAsync,WriteLineAsync来进行异步写。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#文件读写 的相关文章

  • JNI编程—JNI基础

    什么是JNI 怎么使用 JNI Java Native Interface 它是Java平台的一个特性 并不是Android系统特有的 其实主要是定义了一些JNI函数 让开发者可以通过调用这些函数实现Java代码调用C C 的代码 C C
  • python 如何编写一个自己的包

    python 如何编写一个自己的包 先写function 内容 package wadepypk ls init py f1 py f2 py f1 py def show print in pkg f show f2 py def sho
  • unix bsd linux gun   粗略解释

    最早的unix是开放的 很多组织对unix都有修改 期中比较有名的就是伯克利大学的修改版本 叫做bsd 是unix的分支 由于bsd的协议允许你直接使用 修改他的代码 并且可以作为商业用途 所以很多公司的unix都是从bsd衍生过来的 比如
  • mongodb学习笔记一:mongodb安装与介绍

    一 前言 最近开始学习非关系型数据库MongoDB 却在博客园上找不到比较系统的教程 很多资料都要去查阅英文网站 效率比较低下 本人不才 借着自学的机会把心得体会都记录下来 方便感兴趣的童鞋分享讨论 部分资源出自其他博客 旨将零散知识点集中
  • C/C++函数模板template

    1 说明 当函数处理功能相似 函数名相同 但是参数个数或者类型有区别 我们知道实现的方式是依靠函数重载 overload 但是如果仅函数参数或返回数的类型不同 我们想到靠函数模板解决这个问题 不仅节省内存 而且不用复杂声明多个函数 函数模板
  • 为线程池中的每个线程设置UncaughtExceptionHandler

    参考了 java并发编程实战 P134内容 每当线程池需要创建一个线程时 都是通过调用线程工厂方法来完成的 默认的线程工厂方法将创建一个新的 非守护的线程 并且不包好特殊的配置信息 如果你希望在线程运行之前 之后 或者运行中如果发生异常等情

随机推荐

  • Linux 系统 lscpu 命令详解

    文章目录 前言 lscpu 命令详解 命令 1 查看物理 CPU 个数 2 查看每个物理 CPU 核数 3 查看总线程数 4 查看内存信息 5 查看 linux 系统版本 前言 Linux 系统查看系统相关信息方法很多 以下详细介绍 lsc
  • 一颗二叉树代码(图解)

    什么是二叉树 树结构是一种非线性存储结构 存储的是具有一对多关系的数据的集合 而树形结构的一种抽象出来的数据结构往往是二叉树的形式 满足以下两个条件的树就是二叉树 本身是有序树 树中包含的各个节点的度不能超过 2即只能是 0或者1 或者 2
  • 项目时间管理-架构真题(二十四)

    1 霍尔提出了系统方法的三维结构体系 通常称为霍尔三维结构 这就是系统工程方法论的基础 霍尔三维结构以时间堆 堆 知识堆组成的立体结构概括性表示出系统工程在各阶段 各步骤以及所涉及的知识范围 其中时间维是系统的工作进程 对于一个具体的工程项
  • 计算机网络面试八股文攻略(二)—— TCP 与 UDP

    一 基础概念 TCP 与 UDP 是活跃于 运输层 的数据传输协议 TCP 传输控制协议 Transmission Control Protocol 提供面向连接的 可靠的数据传输服务 具体来说就是一种要建立双端连接才能发送数据 能确保传输
  • react拖拽排序、js列表拖拽

    列表拖动排序的解决方案有多种 个人感觉最简单的就是zent 提供的 Sortable 组件了 一 zent Sortable 拖拽排序 推荐 简单明了 zent 官网 https zent contrib gitee io zent zh
  • 1139: 输出最短字符串java

    import java util Scanner public class Main public static void main String args Scanner input new Scanner System in int n
  • Qt第六章 多窗口编程

    一 QMessageBox 消息对话框 掌握 QMessageBox继承自QDialog 是一个Qt内置的用来展示信息或询问用户一个问题的模态对话框 预设了四种类型 像那些已经写好的窗口 这些现成的东西都会有一些特性 就是他们的对象都不需要
  • 基于51单片机的时钟设计

    今天小刚做了一个基于51单片机的时钟 本来想把数码管显示动态扫描放到定时器1的中断里到但是 一按按键 就卡住了 效果不是很理想 所以就放弃了这种方案 不过最后也实现了功能 以下是程序代码 4个按键功能 1 切换 2 时间 3 时间 4 清零
  • [RN] windows7 安装 Realm Studio 后,打开报错 A JavaScript error occurred in the main process...

    windows7 安装 Realm Studio 后 打开报错 报错如下 A JavaScript error occurred in the main process Uncaught Exception Error The specif
  • 为什么说Java只有值传递

    为什么说Java只有值传递 1 值传递概念 2 引用传递概念 3 Java只有值传递 没有引用传递 1 值传递概念 方法调用时 会创建副本 传递的是值的副本 也就是说传递后就不相关了 2 引用传递概念 方法调用时 不会创建副本 传递的是引用
  • 树莓派内核编译

    一 概述 树莓派的github主页 https github com raspberrypi 里面包含了linux源码 交叉编译工具链等内容 对于我们要用到的有两个仓库 https github com raspberrypi linux
  • QT笔记-QTableWidget点击表格头,显示菜单项

    1 添加控件 2 示例源码 h private slots void OnClickHeader int head void OnClickMenu QAction action cpp void Textdemo OnInitTableW
  • [css3] 动画案例---会呼吸的圆

  • Python 源代码缩进格式化工具

    前言 昨天在跟小伙伴聊天 当他谈起自己正在做的项目时 一脸愁容 他吐槽道 该项目的 Python 代码库由多个人共同维护 由于每个人使用的编辑器不同 每个人的编码风格也不同 最终导致了 代码的缩进千奇百怪 有缩进 2 个空格的 有缩进 4
  • 《Linux0.11源码解读》理解(四) head之重新设置IDT/GDT

    上节提到 现在cs ip指向0地址 此处存储着作为操作系统核心代码的system模块 是由head s和 main c以及后面所有源代码文件编译链接而成 head s 以下简称head 紧挨着main c 我们先执行head 重新设置内核栈
  • 带外数据

    定义带 外 数据 想 像一下在银行人们排起队等待处理他们的帐单 在这个队伍中每个人最后都会移到前面由出纳员进行服务 现在想像一下一个走入银行 越过整个队伍 然后用枪抵 住出纳员 这个就可以看作为带 外 数据 这个强盗越过整个队伍 是因为这把
  • 第六天哈希表

    哈希表 哈希表是根据关键码的值而直接进行访问的数据结构 其实呢 数组就是一张哈希表 其中 关键码就是索引下标 然后通过下标访问数组中的元素 什么时候想到用哈希法 当我们遇到了要快速判断一个元素是否出现集合里的时候 就要考虑哈希法 这 要枚举
  • 平衡球迷宫教程(一)

    平衡球迷宫教程 一 今天分享一个简单的小游戏 平衡球迷宫 这个游戏简单易上手 非常适合刚刚接触unity人员作为基础练习 一 建立一个道路 可以让小球在上面滚动 这里我建立的道路是用3D物体中cube建立的起初用的地板plane 但是后期更
  • ChatGPT专业应用:生成奖项方案

    正文共 925 字 阅读大约需要 4 分钟 人力资源等必备技巧 您将在4分钟后获得以下超能力 生成奖项方案 Beezy评级 A级 经过寻找和一段时间的学习 一部分人能掌握 主要提升效率并增强自身技能 推荐人 Kim 编辑者 Yolanda
  • C#文件读写

    C 的IO类库提供了丰富的IO操作 下面我来总结一下其IO类库提供的一些操作文件系统的方法 一 操作驱动器 C 用DriveInfo来操作驱动器 1 创建对象 a 我们可以通过静态方法DriveInfo GetDrives 来获取所有的Dr