File是一个静态类,常用于文件操作,读取,修改文件等等。File类的大部分方法最终都是转换为流(Stream)的操作,只不过是.net提取帮你封装好了这些常用的流。并且会自动清理占用的资源。
例如:下面通过反编译来了解下一个File里的一个普通的方法ReadAllText()的源代码:
[SecuritySafeCritical] public static string ReadAllText(string path) { if (path == null) { throw new ArgumentNullException("path"); } if (path.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); } return InternalReadAllText(path, Encoding.UTF8); //检测没问题则调用这个方法 }
private static string InternalReadAllText(string path, Encoding encoding) //上面用到的方法就是这个 { using (StreamReader reader = new StreamReader(path, encoding)) //可以看到File.ReadAllText()方法最终还是调用StreamReader来操作。 { return reader.ReadToEnd(); } }
以下给出常用的方法
AppendAllText 已重载。 将指定的字符串追加到文件中,如果文件还不存在则创建该文件,如果文件存在则直接添加。 两个方法一个重载用于指定编码。 AppendText 创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件。
Copy 已重载。 将现有文件复制到新文件。 有1个重载,第三个参数为布尔值,指示是否可以改写原有文件。如果不允许改写,而文件又存在会报错。 Create 已重载。 在指定路径中创建文件。
CreateText 创建或打开一个文件用于写入 UTF-8 编码的文本。
Decrypt 解密由当前帐户使用 Encrypt 方法加密的文件。
Delete 删除指定的文件。如果指定的文件不存在,则不引发异常。
Encrypt 将某个文件加密,使得只有加密该文件的帐户才能将其解密。
Exists 确定指定的文件是否存在。
GetAccessControl 已重载。 获取一个 FileSecurity 对象,它封装指定文件的访问控制列表 (ACL) 条目。
GetAttributes 获取在此路径上的文件的 FileAttributes。
GetCreationTime 返回指定文件或目录的创建日期和时间。
GetCreationTimeUtc 返回指定的文件或目录的创建日期及时间,其格式为协调通用时间 (UTC)。
GetLastAccessTime 返回上次访问指定文件或目录的日期和时间。
GetLastAccessTimeUtc 返回上次访问指定的文件或目录的日期及时间,其格式为协调通用时间 (UTC)。
GetLastWriteTime 返回上次写入指定文件或目录的日期和时间。
GetLastWriteTimeUtc 返回上次写入指定的文件或目录的日期和时间,其格式为协调通用时间 (UTC)。
Move 将指定文件移到新位置,并提供指定新文件名的选项。相当于剪切操作。 此方法依然不分文件类型。
Open 已重载。 打开指定路径上的 FileStream。
OpenRead 打开现有文件以进行读取。
OpenText 打开现有 UTF-8 编码文本文件以进行读取。
OpenWrite 打开现有文件以进行写入。
ReadAllBytes 打开一个文件,将文件的内容读入一个字符串,然后关闭该文件。 此方法不分图片,文本还是视频。
ReadAllLines 已重载。 打开一个文本文件,将文件的所有行都读入一个字符串数组,然后关闭该文件。对于中文编码,应该设置编码为UTF-8或GB2312。否则返 回的都是乱码。
ReadAllText 已重载。 打开一个文本文件,将文件的所有行读入一个字符串,然后关闭该文件。
Replace 已重载。 使用其他文件的内容替换指定文件的内容,这一过程将删除原始文件,并创建被替换文件的备份。
SetAccessControl 对指定的文件应用由 FileSecurity 对象描述的访问控制列表 (ACL) 项。
SetAttributes 设置指定路径上文件的指定的 FileAttributes。
SetCreationTime 设置创建该文件的日期和时间。
SetCreationTimeUtc 设置文件创建的日期和时间,其格式为协调通用时间 (UTC)。
SetLastAccessTime 设置上次访问指定文件的日期和时间。
SetLastAccessTimeUtc 设置上次访问指定的文件的日期和时间,其格式为协调通用时间 (UTC)。
SetLastWriteTime 设置上次写入指定文件的日期和时间。
SetLastWriteTimeUtc 设置上次写入指定的文件的日期和时间,其格式为协调通用时间 (UTC)。
WriteAllBytes 创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。如果目标文件已存在,则改写该文件。此方法能够写任何类型的文件,不分文本 图片视频。
WriteAllLines 已重载。 创建一个新文件,在其中写入指定的字符串,然后关闭文件。如果目标文件已存在,则改写该文件。
WriteAllText 已重载。 创建一个新文件,在文件中写入内容,然后关闭文件。如果目标文件已存在,则改写该文件。有一个重载支持设置编码。
文件I/O的改进:
1、在C#4.0之前ReadAllLines()方法用于读取文件中所有的行,并以数组的形式返回,但是它有一个问题,就是这个方法要等所有的行写入内存之后才能读取第一行的内容,.NET4中增加了一个ReadLines方法,该返回返回IEnumerable<string>而不是string[]数组,这个新增的方法效率要高很多,它不是将所有行一次性加入内存中,而是每次只读取一行。这种方法比之前的要好,因为如果打开一个较大的文件,之前的方法要等整个文本都加入内存后,才能访问第一行。而这个新方法并不是将所有行都加载到内存中,而是每次只读取一行。更加高效。
2、WriteAllLines()也增加了类似的IEnumerable重载方法。
以下写了个实例:
static void Main(string[] args) { File.AppendText(@"E:\file1.txt"); //创建file1.txt文本并写入内容,如果文件不存在则创建。固定是UTF-8编码,不可改变。 File.AppendAllText(@"E:\file.txt","你在他乡还好吗?"); //在E盘创建了一个file.txt文件,并在里面写入了 你在他乡还好吗? File.Copy(@"E:\file.txt", @"F:\file.txt",false); File.Create(@"F:\kk.txt"); //在F盘创建文件,重载中可以设置安全权限等信息。 Console.Write(File.Exists(@"E:\file.txt")); //文件存在则True否则False Console.Write(File.GetCreationTime(@"E:\file.txt")); //输出2013/1/13 23:03:02 Console.Write(File.GetCreationTimeUtc(@"E:\file.txt")); //输出2013/1/13 15:03:02 全球标准时间 Console.Write(File.GetLastAccessTime(@"E:\file.txt")); //2013/1/13 23:03:!2 上次访问时间 Console.Write(File.GetLastAccessTimeUtc(@"E:\file.txt")); //2013/1/13 15:03:12 上次访问时间 全球标准时间 Console.Write(File.GetLastWriteTime(@"E:\file.txt")); //2013/1/13 12:53:10 上次写入时间 Console.Write(File.GetLastWriteTimeUtc(@"E:\file.txt")); //2013/1/13 15:53:10 上次写入时间 全球标准时间 File.Move(@"E:\file.txt",@"F:\file.txt"); //将E盘的file.txt移动到了F盘 byte[] byteArr = File.ReadAllBytes(@"E:\file.txt"); foreach (byte b in byteArr) { Console.Write(b); //输出内容的每个字节,一串数字 } string[] strArr = File.ReadAllLines(@"E:\file.txt", Encoding.GetEncoding("gb2312")); //对于中文,应该设置读取的变啊为gb2312或utf8,否则中文都是问号 foreach (string str in strArr) { Console.WriteLine(str); //一行就是一个字符串,所有行组成的字符串数组 } Console.Write(File.ReadAllText(@"E:\file.txt",Encoding.GetEncoding("gb2312"))); //有中文要注意加上编码,否则依然是乱码。 File.SetCreationTime(@"E:\file.txt", DateTime.Now.AddDays(-1)); Console.Write(File.GetCreationTime(@"E:\file.txt")); //输出 2013/1/14 23:30:02 File.SetCreationTime(@"E:\file.txt", DateTime.Now.AddDays(-1)); //国际标准时间 Console.Write(File.GetCreationTimeUtc(@"E:\file.txt")); //输出 2013/1/14 15:30:36 File.SetLastAccessTime(@"E:\file.txt", DateTime.Now.AddDays(-1)); Console.Write(File.GetLastAccessTime(@"E:\file.txt")); //输出 2013/1/14 23:32:46 File.SetLastAccessTimeUtc(@"E:\file.txt", DateTime.Now.AddDays(-1)); //国际标准时间 Console.Write(File.GetLastAccessTimeUtc(@"E:\file.txt")); //输出 2013/1/14 15:32:56 File.SetLastWriteTime(@"E:\file.txt", DateTime.Now.AddDays(-1)); Console.Write(File.GetLastWriteTime(@"E:\file.txt")); //输出 2013/1/14 23:33:42 File.SetLastWriteTimeUtc(@"E:\file.txt", DateTime.Now.AddDays(-1)); //国际标准时间 Console.Write(File.GetLastWriteTimeUtc(@"E:\file.txt")); //输出 2013/1/14 15:33:56 File.WriteAllText(@"E:\file.txt","真的爱你"); //提示 访问被拒绝,先改掉只读属性吧。然后文件里面的文本变成了"真的爱你",注意会替换原有内容 string[] strArr = { "你", "好", "吗", "?" }; File.WriteAllLines(@"E:\file.txt",strArr); //此方法同样会替换原有文本,参数为字符串数组,一个字符串一行 FileAttributes f = File.GetAttributes(@"E:\file.txt"); //获取到的是一个标志枚举的实例 if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) //此处实现了判断文件是否只读,其它信息要通过位运算得到 { Console.Write("此文件是只读的"); } else { Console.Write("此文件不是只读的"); } //设置文件属性,用标志枚举设置 File.SetAttributes(@"E:\file.txt", FileAttributes.ReadOnly); //将此文件设置为只读之后真的修改不了了,手动也修改不了。 File.SetAttributes(@"E:\file.txt", FileAttributes.Hidden | FileAttributes.ReadOnly); //位运算,同时设置隐藏与只读 string str = "你在他乡还好吗?"; byte[] bytes = Encoding.UTF8.GetBytes(str); File.WriteAllBytes(@"E:\file.txt",bytes); //没有文件会自动创建此段代码已经运行,E:\file.txt文件的内容就变成了 你在他乡还好吗? //Open 已重载。 打开指定路径上的 FileStream。 方便了点,帮助new了FileStream而已,跟自己new FileStream一样 FileStream fs = File.Open(@"E:\file.txt",FileMode.Open,FileAccess.Read); byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); Console.WriteLine(Encoding.UTF8.GetString(bytes)); //输出E:\file.txt里的文件内容。 FileStream fs = File.OpenRead(@"E:\file.txt"); byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); Console.WriteLine(Encoding.UTF8.GetString(bytes)); //输出E:file.txt里的文件内容 FileStream fs = File.OpenWrite(@"E:\file.txt"); //此方法是内容是写在原有内容的前面。 byte[] bytes = Encoding.UTF8.GetBytes("真的爱你"); fs.Write(bytes,0,bytes.Length); fs.Flush(); StreamWriter sw = File.CreateText(@"E:\kk.txt"); sw.Write("测试CreateText方法"); //在E盘下生成一个kk.txt文件,其实File.CreateText内部还是new了个StreamWriter,方便点而已。 sw.Flush(); StreamReader sr = File.OpenText(@"E:\kk.txt"); string str = sr.ReadToEnd(); Console.WriteLine(str); //输出E:\kk.txt 的内容 //以下未了解的方法,有时间要研究下 //File.Encrypt(@"E:\file.txt"); //File.Decrypt(@"E:file.txt"); //File.GetAccessControl(); //SetAccessControl 对指定的文件应用由 FileSecurity 对象描述的访问控制列表 (ACL) 项。 // 创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。如果目标文件已存在,则改写该文件。 //File.Replace(@"E:\file.txt", @"E:\file.txt", @"F:\123.txt"); Console.ReadKey(); }