文件操作
文件操作我们通常用到三个类:File、FileInfo和FileStream,都是在命名空间System.IO下的
File
File是一个静态类,不用实例化可直接使用。它提供用于创建、复制、删除、移动、和打开文件的静态方法
常用方法:
1、File.Create(@"D:\Test\Debug1\测试.txt")//创建文件方法 参数1:要创建的文件路径
2、File.Open(@"D:\Test\Debug1\测试.txt",FileMode.Append) //打开文件方法 参数1:要打开的文件路径,参数2:打开的文件方式
3、File.AppendAllText(@"D:\Test\Debug1\测试.txt","哈哈"); //追加文件方法 参数1:要追加的文件路径,参数2:追加的内容
4、 File.Copy(@"D:\Test\Debug1\测试.txt", @"D:\Test\Debug2\测试1.txt", true); //复制文件方法 参数1:要复制的源文件路径,参数2:复制后的目标文件路径,参数3:是否覆盖相同文件名
5、File.Move(@"D:\Test\Debug1\测试.txt", @"D:\Test\Debug3\测试2.txt"); //移动文件方法 参数1:要移动的源文件路径,参数2:移动后的目标文件路径
6、File.Delete(@"D:\Test\Debug1\测试.txt"); //删除文件方法 参数1:要删除的文件路径
7、File.SetAttributes(@"D:\Test\Debug1\测试.txt", FileAttributes.Hidden); //设置文件属性方法 参数1:要设置属性的文件路径,参数2:设置的属性类型(只读、隐藏等)
还有其他方法我们就不继续讲了,都是很简单的方法,大家用VS实践一下就会了,下面我们看一个图片文件的小例子:
byte[] by = File.ReadAllBytes(@"C:\Users\10393\Pictures\Saved Pictures\捕获.PNG");//读取一张照片放到字节数组里
byte[] newby = new byte[by.Length];//创建一个新的字节数组
for (int i = 0; i < by.Length/2; i++)
{
newby[i] = by[i];//将读取的图片字节放一半到新数组里
}
File.WriteAllBytes("D:/New.PNG",newby);//将装有一半图片字节内容的数组写入一张新照片
我们查看新图片会发现只有原图片的一半。
将字符串转换成字节数组:
byte[] brr = Encoding.Default.GetBytes(str);//str为要转换的字符串
FileInfo
FileInfo是非静态类(其实学完文件夹操作发现带有Info的都是非静态的),提供创建、复制、删除、移动和打开文件的属性和实例方法,并且帮助创建 FileStream 对象。 此类不能被继承。
该类含有以下属性:
名称 说明
Attributes 获取或设置当前文件或目录的特性。
CreationTime 获取或设置当前文件或目录的创建时间。
CreationTimeUtc 获取或设置当前文件或目录的创建时间,其格式为协调世界时 (UTC)。
Directory 获取父目录的实例。
DirectoryName 获取表示目录的完整路径的字符串。
Exists 获取指示文件是否存在的值。 (重写 FileSystemInfo.Exists。)
Extension 获取表示文件扩展名部分的字符串。
FullName 获取目录或文件的完整目录。
IsReadOnly 获取或设置确定当前文件是否为只读的值。
LastAccessTime 获取或设置上次访问当前文件或目录的时间。
LastAccessTimeUtc 获取或设置上次访问当前文件或目录的时间,其格式为协调世界时 (UTC)。
LastWriteTime 获取或设置上次写入当前文件或目录的时间。
LastWriteTimeUtc 获取或设置上次写入当前文件或目录的时间,其格式为协调世界时 (UTC)。
Length 获取当前文件的大小(字节)。
Name 获取文件名。 (重写 FileSystemInfo.Name。)
并有以下方法:
名称 说明
AppendText 创建一个 StreamWriter,它向 FileInfo 的此实例表示的文件追加文本。
CopyTo(String) 将现有文件复制到新文件,不允许覆盖现有文件。
CopyTo(String, Boolean) 将现有文件复制到新文件,允许覆盖现有文件。
Create 创建文件。
CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。
CreateText 创建写入新文本文件的 StreamWriter。
Decrypt 使用 Encrypt 方法解密由当前帐户加密的文件。
Delete 永久删除文件。
Encrypt 将某个文件加密,使得只有加密该文件的帐户才能将其解密。
Equals(Object) 确定指定的对象是否等于当前对象。
GetAccessControl() 获取 FileSecurity 对象,该对象封装当前 FileInfo 对象所描述的文件的访问控制列表 (ACL) 项。
GetAccessControl(AccessControlSections)
获取 FileSecurity 对象,该对象封装当前 FileInfo 对象所描述的文件的指定类型的访问控制列表 (ACL) 项。
GetHashCode 作为默认哈希函数。
GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。
GetObjectData 设置带有文件名和附加异常信息的 SerializationInfo 对象。
GetType 获取当前实例的 Type。
InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。
MoveTo 将指定文件移到新位置,并提供指定新文件名的选项。
Open(FileMode) 在指定的模式中打开文件。
Open(FileMode, FileAccess) 用读、写或读/写访问权限在指定模式下打开文件。
Open(FileMode, FileAccess, FileShare)
用读、写或读/写访问权限和指定的共享选项在指定的模式中打开文件。
OpenRead 创建只读 FileStream。
OpenText 创建使用 UTF8 编码、从现有文本文件中进行读取的 StreamReader。
OpenWrite 创建只写 FileStream。
Refresh 刷新对象的状态。
Replace(String, String) 使用当前 FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。
Replace(String, String, Boolean)
使用当前 FileInfo 对象所描述的文件替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。还指定是否忽略合并错误。
SetAccessControl 将 FileSecurity 对象所描述的访问控制列表 (ACL) 项应用于当前 FileInfo 对象所描述的文件。
ToString 以字符串形式返回路径。
FileStream
FileStream对象表示在磁盘或网络路径上指向文件的流。当类提供向文件读写字节的方法时,经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作字节和字节数组,而Stream类操作字符数据。字符数据易于使用,但是有些操作比如随机文件访问,就必须由FileStream对象执行。
FileStream对象的构造函数:
FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);
FileMode枚举具有几种成员:
Append------如果文件存在,就打开文件,将文件位置移动到文件的末尾,并创建一个新文件。FileMode.Append仅可以与枚举Fileaccess.Write联合使用
Create------创建新文件;如果存在这样的文件,就破坏它。
CreateNew------创建新文件,但是如果已经存在此文件,则抛出异常
Open------打开现有的文件,但是不存在所指定的文件,则抛出异常
OpenOrCreate------如果文件存在,则规定打开文件,否则就创建新文件,如果文件已经存在,则保留在文件中的数据
Truncate------打开现有文件,清除其内容,然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期,必须存在有文件,否则就抛出异常
读取数据:
FileStream fs = new FileStream("demo.txt",FileMode.Open);//初始化文件流
byte[] array = new byte[fs.Length];//初始化字节数组
fs.Read(array, 3, array.Length);//读取流中数据到字节数组中
fs.Close();//关闭流
string str = Encoding.Default.GetString(array);//将字节数组转化为字符串Console.WriteLine(str);
注意,记得关闭流,不然可能会在后面再对此文件操作时产生进程占用的异常
写入数据:
FileStream fs = new FileStream("demo.txt",FileMode.Append);// 初始化文件流
byte[] array = Encoding.UTF8.GetBytes("Hello World!你好");//给字节数组赋值
fs.Write(array, 0, array.Length);//将字节数组写入文件流
fs.Close();//关闭流
总结:
File集中了FileInfo和FileStream两者的大部分功能,在只需要单次或少数几次对文件进行操作的时候,适合用File,FileInfo适合用于获取文件信息,当需要进行读写等多项操作时,适合用FileStream