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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM