C#文件读写

来源:互联网 发布:黄山招聘美工 编辑:程序博客网 时间:2024/06/01 15:25

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来进行异步写。


0 0
原创粉丝点击