File类与FileInfo类

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();
        }
时间: 2024-10-19 11:23:12

File类与FileInfo类的相关文章

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

文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们常常想到目录路径,磁盘存储,文件和目录名等方面. I/O流提供一种后备存储写入字节和从后备存储读取字节的方式. 后备存储可以为多种存储媒介之一. System.IO命名空间中的常用类: BinaryReader     用特定的编码将基元数据类型读作二进制值 BinaryWriter     以二进制形式将基元类型写入流,并支持用特定的编码写入字符串 Directory      

C# 运用DirectoryInfo类和FileInfo类

DirectoryInfo类和FileInfo类的基类都是FileSystemInfo类,这个类是一个抽象类,也就是说你不可以实例化该类,只能通过继承产生其子类并实例化其子类.然而你却可以运用由该类定义的各种属性,下面的表格显示了该类已经定义了的各种属性. 表2 DirectoryInfo类提供了创建.删除和移动目录等方法,要运用表2中的各种属性,我们首先得创建一个DirectoryInfo类的对象,然后就可以访问其各种属性了. 同时,我们还可以运用FileAttributes枚举类型值来获取和

C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表

C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表 2011-12-13 09:00:40| 分类: C# |举报|字号 订阅 OpenFileDialog openFileDialog1 = new OpenFileDialog(); if(openFileDialog1.ShowDialog() == DialogResult.OK) { openFileDialog1.FileName; System.IO.FileInfo file = new System.IO.Fil

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

System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间.下面通过程序实例来介绍其主要属性和方法. (1) 文件打开方法:File.Open () 该方法的声明如下:     public static FileStream Open(string path,FileMode mode)  下面的代码打开存放在c:\tempuploads目录下名称为newFile.txt文件,并在该文件中写入hello. pri

C# 文件类中 File ,FileInfo 类的主要区别

System.IO命名空间中提供的文件操作类有File和FileInfo,这两个类的功能基本相同,只是File是静态类,其中所有方法都是静态的,可以通过类名直接调用,不需要实例化.而FileInfo是普通类,只有实例化对象后才可以调用其中的方法. File类是一个静态类,它对应整个文件系统进行操作,方法均为静态文法:如果只是对文件进行少量的操作,如判断文件是否存在之类或者对很多的文件进行操作,建议使用File类,可以避免频繁创建和释放对象的系统开销. FileInfo类是一个实例类,它对应某一个

C# 运用FileInfo类创建、删除文件

通过FileInfo类,我们可以方便地创建出文件,并可以访问文件的属性同时还可以对文件进行打开文件.关闭文件.读写文件等基本的操作.下面的代码显示了如何创建一个文本文件并且去访问其创建时间.文件的绝对路径以及文件属性等文件信息,最后程序还给出了删除文件的方法.  FileInfo fi = new FileInfo(@"F:\Myprogram.txt");FileStream fs = fi.Create();Console.WriteLine("Creation Time

File类和RandomAccessFile类?

转载: Java IO的RandomAccessFile的使用 01_File类和RandomAccessFile类 现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下"Lucene是一款非常优秀的全文检索库".可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了"Lucene是一款非常优秀的全文检索库",又写回文本里了,至此,大

C# 理解FileInfo类的Open()方法

我们在对文件进行读写操作之前必须打开文件,FileInfo类为我们提供了一个Open()方法,该方法包含了两个枚举类型值的参数,一个为FileMode枚举类型值,另一个为FileAccess枚举类型值.通过设定这两个参数值,我们可以对文件的访问模式和操作权限进行控制.下面的两个表格分别显示了FileMode枚举类型的值和FileAccess枚举类型的值. 表4 表5 下面的代码显示了Open()方法的具体运用方法.  FileInfo f = new FileInfo("F:\MyFile.tx

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类

J2SE知识点归纳笔记(七)---Java IO Part 1:File类与RandomAccessFile类                                                                 --转载请注明出处:coder-pig 本节引言: 兜兜转转,又回来写Java了,上一篇J2SE知识点归纳笔记(六)---Java常用类是上2014.4.14写的,时隔一年 又来重拾之前还没写完的系列了,前些天群里一个妹子反映她Java基础薄弱,然后抱怨在cs