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();
}

File类与FileInfo类的更多相关文章

  1. C#文件操作基础之File类和FileInfo类

    文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...

  2. C# 运用DirectoryInfo类和FileInfo类

    DirectoryInfo类和FileInfo类的基类都是FileSystemInfo类,这个类是一个抽象类,也就是说你不可以实例化该类,只能通过继承产生其子类并实例化其子类.然而你却可以运用由该类定 ...

  3. 文件及文件夹操作- File类、Directory 类、FileInfo 类、DirectoryInfo 类

    文件及文件夹操作: C/S:WinForm可以操作客户端文件 Client ServerB/S:Brower Server 命名空间:using system .IO; 1. File类: 创建:Fi ...

  4. .net框架 - File类与FileInfo类异同

    System.IO命名空间中提供的文件操作类有File和FileInfo,这两个类的功能基本相同,只是File是静态类,其中所有方法都是静态的,可以通过类名直接调用,不需要实例化.而FileInfo是 ...

  5. File类、FileInfo类、Directory类、DirectoryInfo类

    File类.Directory类,都是静态类,可以直接使用类名 FileInfo类.DirectoryInfo类,都是动态类,需要new对象,通过对象来操作 [文件的创建.复制.移动.删除]using ...

  6. file类和fileinfo类的简单对比

    File类:提供用于操作文件的静态方法. FileInfo类:提供操作文件的属性和实例方法. Directory类:提供用于操作目录的静态方法. DirectoryInfo类:提供用于操作目录的实例方 ...

  7. c# DirectoryInfo 类和 FileInfo 类

    1.DirectoryInfo 类 DirectoryInfo 类派生自 FileSystemInfo 类.它提供了各种用于创建.移动.浏览目录和子目录的方法.该类不能被继承. 2.FileInfo ...

  8. File类与FileInfo类区别

    ile类是静态的,FileInfo不是静态的也没有静态的方法,仅可用于实例化的对象.FileInfo方法基本类似于File.关于二者,作何选择. ● 如果仅进行单一方法调用,则可以使用静态File类上 ...

  9. 详解C#中System.IO.File类和System.IO.FileInfo类的用法

    System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间.下面通过程序实例来介绍其主要属性和方法. (1) 文件打开 ...

随机推荐

  1. Windows 8.1 with update 官方最新镜像汇总(全)

    Windows 8.1 with update 官方最新镜像汇总,发布日期: 2014/12/16,Microsoft MSDN. 镜像更新日志: 12/29:32位大客户专业版中文版12/24:64 ...

  2. 利用智能手机(Android)追踪一块磁铁(二)

    在上一篇博客中提到了利用磁场强度推算传感器位置坐标的公式,下面就介绍怎么利用智能手机完成磁铁的追踪(任何具有磁感应器的装置均可以),这里主要是利用Android手机. 1:程序步骤: 首先将磁铁放置在 ...

  3. Handler消息机制实现更新主UI

    如下实现的是简单的更新主UI的方法,用Handler消息机制 将textview的内容每隔一秒实现num++ /* * handler消息机制 * asynctask异步任务 *  * httpcli ...

  4. poj 2697 A Board Game(bfs+hash)

    Description Dao was a simple two-player board game designed by Jeff Pickering and Ben van Buskirk at ...

  5. 2D和3D空间中计算两点之间的距离

    自己在做游戏的忘记了Unity帮我们提供计算两点之间的距离,在百度搜索了下. 原来有一个公式自己就写了一个方法O(∩_∩)O~,到僵尸到达某一个点之后就向另一个奔跑过去 /// <summary ...

  6. java删除文件夹下所有文件

    package org.sw; import java.io.File; /** * * @author mengzw * @since 3.0 2014-2-26 */ public class D ...

  7. thinkphp框架的路径问题 - 总结

    thinkphp框架的路径问题 - 总结 (2011-06-21 11:01:28) 转载▼ 标签: thinkphp 框架 路径 杂谈 分类: Php TP中有不少路径的便捷使用方法,比如模板中使用 ...

  8. MBTI性格测试

    INFP 哲学家型——生活在自己的理想世界 报告接收人: 才储成员4361454 日期: 2014/9/2 一.你的MBTI图形 倾向示意图表示四个维度分别的倾向程度.从中间往两侧看,绿色指示条对应下 ...

  9. MongoDB学习笔记02

    MongoDB中使用find来进行查询,查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档.空的查询文档{}会匹配集合的全部内容,要是不指定查 ...

  10. Common Table Expressions (CTE)

    子查询有时使用起来很麻烦,因为所有的过滤和匹配逻辑都必须集成到子查询表达式中.如果只需要执行一个任务,且只需要使用一次杳询表达式,子查询是很好的选择.但子查询不能被重用,也不能很好地支持多个需求.这个 ...