File 操做文件,靜態類,對文件總體操做。拷貝,刪除,剪切等
Directory 操做目錄(文件夾),靜態類。
DirectoryInfo 文件夾的一個「類」,用來描述一個文件夾對象(獲取指定目錄下的全部目錄時返回的一個DirectoryInfo數組)
FileInfo 文件類,用來描述一個文件對象,獲取指定目錄下的全部文件時,返回一個FileInfo數組。
Path 對文件或目錄的路徑進行操做(很方便),它是一個靜態類
Stream 文件流,抽象類,它是全部流的父類,下面是它的幾個經常使用子類
FileStream 文件流 ,MemoryStream 內存流, NetworkStream網絡流
StreamReader 快速讀取文本文件(逐行讀取)
StreamWriter 快速寫入文本文件
GZipStrean 壓縮流數組
[csharp] view plaincopy網絡
using System; ide
using System.Collections.Generic; 測試
using System.Linq; 編碼
using System.Text; spa
namespace Path類 .net
{ code
class Program 對象
{ blog
static void Main(string[] args)
{
string filepath = @"H:\音樂\無損\李玉剛\南飛雁.wav";
//如今咱們要獲取「南飛雁.wav」這個名字。咱們能夠這麼獲取。
Console.WriteLine(filepath.Substring(filepath.LastIndexOf(@"\")+1)); //輸出:南飛雁.wav
//---------------------------如今咱們有更好的方法------------------------------------
//1.獲取文件名
Console.WriteLine(Path.GetFileName(filepath)); //輸出:南飛雁.wav
//2.獲取文件後綴
Console.WriteLine(Path.GetExtension(filepath)); //輸出:.wav
//3.獲取不帶後綴的文件名
Console.WriteLine(Path.GetFileNameWithoutExtension(filepath)); //輸出:南飛雁
//4.獲取該路徑的目錄部分
Console.WriteLine(Path.GetDirectoryName(filepath)); //輸出:H:\音樂\無損\李玉剛
//5.將路徑中文件名的後綴改成.mp3
//注意:這裏僅僅是修改的filepath這個字符串的後綴,與文件沒有任何關係。他不會修改文件後綴
Console.WriteLine(Path.ChangeExtension(filepath, "mp3")); //輸出:H:\音樂\無損\李玉剛\南飛雁.mp3
//6.將兩個路徑相加
string s1 = @"d:\abc\x";
string s2 = "hello.txt";
Console.WriteLine(Path.Combine(s1, s2)); //輸出:d:\abc\x\hello.txt
//7.獲取一個相對路徑的絕對路徑
Console.WriteLine(Path.GetFullPath("Program.cs")); //輸出:D:\MVC\MvcTest\文件操做類\bin\Debug\Program.cs
// 獲取當前操做系的統臨時目錄的路徑 (就拿解壓縮來舉列子:當你打開一個壓縮文件,注意此時你並無點擊解壓縮,僅僅是打開一個壓縮文件查看壓縮文件的內 容,但是其實就在你打開壓縮文件的時候,壓縮軟件就已經對這個文件進行解壓了,由於只有解壓了你才能看到文件的內容。由於你沒有點擊解壓縮,僅僅是打開的 壓縮文件,查看內容,因此解壓縮軟件會在系統的臨時目錄下生成一個臨時目錄來保存剛剛解壓的文件,在用戶查看壓縮文件完畢後,關閉的時候,就解壓縮軟件就 會刪除這個臨時目錄)
Console.WriteLine(Path.GetTempPath()); //輸出:C:\Users\FB\AppData\Local\Temp\
//8.由於系統臨時目錄是公有的,你們均可以訪問,並在裏面建立一個臨時目錄,怎麼保證各自建立的臨時目錄不重名呢?(答案是:由系統返回給咱們一個臨時目錄名)
//建立磁盤上惟一命名的零字節的臨時文件並返回該文件的完整路徑。
Console.WriteLine(Path.GetTempFileName()); //輸出:C:\Users\FB\AppData\Local\Temp\tmp828.tmp
}
}
}
[csharp] view plaincopy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Directory類
{
class Program
{
static void Main(string[] args)
{
//操做目錄類Directory
//-------------------------判斷文件夾是否存在Exists()-----------------------
//4.判斷指定路徑下的文件夾是否存在,若是存在則爲 true;不然爲 false
Console.WriteLine(Directory.Exists(@"d:\1"));
//-------------------------建立目錄CreateDirectory()-----------------------
//1.建立一些10個目錄
for (int i = 1; i <= 10; i++)
{
//在D盤下的abc目錄下建立10個文件夾,命名爲1-10 (若是D盤下的abc文件夾存在,則在裏面建立10個文件夾,若是不存在就建立這個abc文件夾後,再在裏面建立10個文件夾)
Directory.CreateDirectory(@"D:\abc\" + i);
}
//-------------------------刪除目錄Delete()-----------------------
//3.刪除一些目錄
//刪除目錄的時候,若是指定的目錄不存在則拋異常 :未能找到路徑「D:\abc\11」的一部分。
Directory.Delete(@"D:\abc\11");
//刪除目錄的時候,若是指定的目錄不爲空則拋異常 :目錄不是空的。(爲了測試,我在1這個文件裏放了一個文件)
Directory.Delete(@"D:\abc\1");
//刪除指定的目錄並刪除該目錄中的全部子目錄和文件(即使指定目錄裏包含文件,指定目錄及文件都會被刪除)。
Directory.Delete(@"D:\abc\1", true);
//-------------------------移動目錄Move()-----------------------
//3.移動(剪切)一些目錄
//移動(剪切)不能跨磁盤操做,不然拋異常 : 源路徑和目標路徑必須具備相同的根。移動操做在卷之間無效。
//Directory.Move(@"D:\abc\1", @"F:\xyz");//錯誤的
//將D盤下的abc文件夾下的2這個文件夾及文件剪切到D盤,並將2這個文件夾重命名爲1 ,若是1這個文件以前就已經存在,則拋異常:當文件已存在時,沒法建立該文件。
Directory.Move(@"d:\abc\2", @"d:\1");
//-------------------------獲取子目錄,後代目錄GetDirectories()-----------------------
//5.獲取指定目錄下的全部子目錄(獲取的是:直接子目錄)
foreach (var i in Directory.GetDirectories(@"d:\abc"))
{
Console.WriteLine(i);
}
//5.1獲取指定目錄下的全部後代目錄;(第二個參數是通配符,*表示全部後代目錄,6*表示以6開頭的全部後臺目錄,*中國*,表示包含「中國」的全部後代目錄)
foreach (var i in Directory.GetDirectories(@"d:\abc", "*", SearchOption.AllDirectories))
{
Console.WriteLine(i);
}
//-------------------------獲取子文件,後代文件GetFiles()-----------------------
//6獲取指定目錄下的全部子文件(獲取的是:直接子文件)
foreach (var i in Directory.GetFiles(@"D:\經常使用軟件"))
{
Console.WriteLine(i);
}
//6.1獲取指定目錄下的全部後代文件 (第三個參數表示搜索指定目錄下的全部後代文件)
foreach (var i in Directory.GetFiles(@"D:\經常使用軟件","*",SearchOption.AllDirectories))
{
Console.WriteLine(i);
}
}
}
}
[csharp] view plaincopy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace File類
{
class Program
{
static void Main(string[] args)
{
//File 文件類
//-------------------------判斷文件是否存在Exists()---------------------
//肯定指定的文件是否存在。如存在則返回true;不然返回false
Console.WriteLine(File.Exists(@"d:\news\wowo.txt"));
//-------------------------建立文件Create()---------------------
//建立文件
File.Create(@"d:\news\hello.txt");
//在D盤建立一個utf8.txt文件,這個文件是用於寫入 UTF-8 編碼的文本。
File.CreateText(@"d:\utf8.txt");
//-------------------------刪除文件Delete()---------------------
//刪除指定文件(即使指定路徑的文件不存在,也不會拋異常)
File.Delete(@"d:\news\hello.txt");
//-------------------------複製文件Copy()---------------------
//將d盤下的news文件夾下的wo.txt文件,複製到e盤下,命名爲no.txt,true表示容許覆蓋同名的文件。若是e盤以前就存在b.txt,那就就將其覆蓋
File.Copy(@"d:\news\wo.txt", @"e:\no.txt",true);
//-------------------------剪切(移動)文件Move()---------------------
//將d盤下的news文件夾下的no.txt文件,剪切到e盤下,並從新將它命名爲wo.txt (前提是e盤下以前就有a文件夾,不然拋異常:未能找到路徑中的某個部分。)
File.Move(@"d:\news\no.txt",@"e:\aa\wo.txt");
//-------------------------替換指定文件的內容Replace()---------------------
//使用其餘文件的內容替換指定文件的內容,這一過程將刪除原始文件,並建立被替換文件的備份。
//將D盤下的1.txt文件內容【替換】2.txt文件的內容(這樣2.txt裏面將保存1.txt的內容),而後將1.txt文件刪除。
File.Replace(@"d:\1.txt", @"d:\2.txt", @"d:\wowo.txt"); //既然2.txt的內容被1.txt替換掉了,那麼第三個參數就是2.txt文件內容的備份
//---------------------文件的讀取,與寫入----------------------------
//打開一個文件,使用指定的編碼讀取文件的全部行,而後關閉該文件 (讀取全部行,返回string[]數組)
string[] rows = File.ReadAllLines(@"D:\new\文檔及資料\wo.txt", Encoding.Default);
//建立一個新文件,在其中寫入指定的字符串數組,而後關閉該文件。 若是目標文件已存在,則覆蓋該文件。
File.WriteAllLines(@"d:\wowo.txt", rows,Encoding.Default);
//打開一個文件,使用指定的編碼讀取文件的全部行,而後關閉該文件。 (讀取全部文本內容,返回string字符串)
string file = File.ReadAllText(@"D:\new\文檔及資料\wo.txt", Encoding.Default);
//建立一個新文件,在其中寫入指定的字符串,而後關閉文件。 若是目標文件已存在,則覆蓋該文件。
File.WriteAllText(@"d:\nono.txt", file,Encoding.Default);
//打開一個文件,將文件的內容讀入一個字符串,而後關閉該文件。
byte[] fielStream = File.ReadAllBytes(@"D:\new\文檔及資料\wo.txt");
//建立一個新文件,在其中寫入指定的字節數組,而後關閉該文件。 若是目標文件已存在,則覆蓋該文件。
File.WriteAllBytes(@"d:\haha.txt", fielStream);
//---------------------------文件內容的追加-------------------------
string[] fileContent= File.ReadAllLines(@"H:\code\bigtree\bigtree\log\2014-10-30.log",Encoding.Default);
// 在一個文件中追加文本行,而後關閉該文件。若是文件尚不存在,則建立該文件。
File.AppendAllLines(@"d:\wowo.txt", fileContent);
string fileTxt = File.ReadAllText(@"H:\code\bigtree\bigtree\log\2014-10-30.log", Encoding.Default);
//將指定的字符串追加到文件中,若是文件還不存在則建立該文件。
File.AppendAllText(@"d:\nono.txt", fileTxt,Encoding.Default);
//建立一個 System.IO.StreamWriter,它將 UTF-8 編碼文本追加到現有文件。
StreamWriter sw= File.AppendText(@"d:\nono.txt");
}
}
}
FileMode.Append (FileMode.Append 是優先打開文件,如文件不存在才建立新文件)
表示在現有的文件上追加內容(若是文件不存在則建立新文件,若是文件存在,就打開,並在文件末尾追加內容)
建立一個新文件。 若是文件已存在,就將它覆蓋掉。
FileMode.Ceate (FileMode.Ceate 是建立新文件)
建立一個新文件。 若是文件已存在,就報異常,
FileMode.CreateNew
打開一個文件,若是文件存在則打開,若是文件不存在就建立一個新文件
FileMode.OpenOrCreate
打開一個的文件,若是文件不存在則報異常
FileMode.Open
打開一個文件,並當即將這個文件的內容清空(注意,打開這個文件的建立日期仍是原來的那個日期)
FileMode.Truncate
----------------------------------------
上面說了FileMode.Append 是打開文件,文件不存在就建立文件,並在文件末尾追加內容
而FileMode.OpenOrCreate 也是打開文件,文件不存在就建立文件。那麼他們之間的區別是什麼呢?
答案:他們的的區別是取決於第三個參數FileAccess
FileAccess.Read 對文件的讀訪問。 可從文件中讀取數據,不能寫入數據(即:只能讀不能寫)
FileAccess.Write 對文件的寫訪問。 可將數據寫入文件,不能讀取文件 (即:只能寫不能讀)
FileAccess.ReadWrite 對文件的讀訪問和寫訪問。 可從文件讀取數據和將數據寫入文件。(即:能讀能寫)
[csharp] view plaincopy
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 文件流FileStream
{
class Program
{
static void Main(string[] args)
{
//File類的方法: 快速獲得文件流
FileStream fsA = File.Open(@"D:\wowo.txt",FileMode.OpenOrCreate);
FileStream fsB = File.OpenRead(@"D:\wowo.txt");
FileStream fsC = File.OpenWrite(@"D:\wowo.txt");
FileStream fsD = new FileStream(@"D:\wowo.txt", FileMode.OpenOrCreate);
//----------------------------------文件流的使用方式---------------------------------------
string str = "中國美國德國俄羅斯";
//將一個字符串變成一個字節數組
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
//將一個字節數組轉換成一個字符串
string msg = System.Text.Encoding.UTF8.GetString(bytes);
//文件流不能操做字符串,文件流操做的都是字節
//-----------------------------------經過FileStream來寫文件-----------------------------------
//文件流的使用步奏
//1.建立文件流 (fsWrite是文件流,不是二進制數組)
FileStream fsWrite = new FileStream(@"d:\wowo.txt", FileMode.Create, FileAccess.Write);
//2.使用文件流,執行往文件寫入數據的操做
string msgB = "今天是個好日子。lalala....";
byte[] bytesB = System.Text.Encoding.UTF8.GetBytes(msgB);
//3.表示將指定的字節數組中的內容寫入到文件(其實此時並無真正的寫入,只是放到緩衝區了)
fsWrite.Write(bytesB, 0, bytesB.Length);
//4.將緩衝區的全部數據當即寫入到文件中,而後清空緩衝區
fsWrite.Flush();
//5.關閉文件流,並釋放資源 (注意:關閉後是能夠再次打開的)
fsWrite.Close();
//6.銷燬文件流,釋放資源 (注意:銷燬後就沒法再打開了)
fsWrite.Dispose();
// 其實大多時間咱們都不會寫fsWrite.Flush()和fsWrite.Close();這兩個方法,通常只須要些 fsWrite.Dispose();就能夠了。由於當你調用fsWrite.Dispose(); 的時候,它內部會調用 fsWrite.Close(),而fsWrite.Close();內部又會去調用fsWrite.Flush();
//若是實現了IDispose接口的類直接用using就好了。using結束的時候會自動幫咱們調用Dispose()方法
//-----------------------------------經過FileStream來讀文件-----------------------------------
//使用FileStream文件流讀取文本文件的時候不要,指定編碼,由於編碼是在將byte[]數組轉換爲字符串的時候才須要使用編碼,而這裏是直接讀取到byte[],因此無需編碼
//1.建立文件流(fsRead是文件流,不是二進制數組)
using (FileStream fsRead = new FileStream(@"d:\wowo.txt", FileMode.Open, FileAccess.Read))
{
byte[] bytesC = new byte[fsRead.Length];//建立一個二進制數組,長度爲fsRead這個流的長度
fsRead.Read(bytesC, 0, bytesC.Length); //從流中讀取字節,而後保存到bytesC這個二進制數組中
string strC = System.Text.Encoding.UTF8.GetString(bytesC); //將bytesC這個二進制數組轉換成字符串
Console.WriteLine(strC);
//注意:其實咱們在根據文件流的總字節數,即長度,來建立bytesC這個二進制數組,用來存放「d:\wowo.txt」這個文件的二進制字節數據,其實這樣對於小文件來講是適用的,可是對於大文件來講就不適用了,由於這種方式會將文件內容一次性讀取到bytesC中
}
Console.WriteLine("OK");
Console.ReadKey();
}
}
}
FileStream文件流的綜合使用
[csharp] view plaincopy
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 文件流FileStream
{
class Program
{
static void Main(string[] args)
{
//------------------------------FileStream的綜合應用,大文件的拷貝-----------------------------------
string source_file=@"G:\最美的地球.flv";
string des_file=@"D:\最美的地球.flv";
using (FileStream fsReadD = new FileStream(source_file, FileMode.Open, FileAccess.Read))
{
using(FileStream fsWriteD=new FileStream(des_file,FileMode.Create,FileAccess.Write))
{
byte[] bytesD = new byte[1024 * 1024 * 5];
//Read()方法的返回值是本次實際讀取到的字節個數
int i = fsReadD.Read(bytesD, 0, bytesD.Length);
while(i>0)
{
//將bytesD這個字節數組的數據寫入到D:\最美的地球.flv 這個文件
fsWriteD.Write(bytesD, 0, i);
//注意這個i不能少; 當將bytesD這個字節數組的數據寫入到D:\最美的地球.flv 這個文件後,再次從上次讀取結束的位置接着讀取數據保存到bytesD中,知道讀取完畢(完畢即:i<=0)
i= fsReadD.Read(bytesD, 0, bytesD.Length);
//有人會問,它怎麼會知道從上次讀取結束的位置接着向後讀取字節數據呢,而不是從文件的開始位置讀取呢?:答案是:每一個文件流內部都有一個Position屬性,這個屬性的值就獲取或者設置此流的當前位置。//long a= fsReadD.Position;
}
}
}
Console.WriteLine("OK");
Console.ReadKey();
}
}
}
題外:
[csharp] view plaincopy
//日常咱們建立FileStream對象的時候是這樣建立的: FileStream fs=new FileStream(參數);
//可是內次new一下很麻煩,當你要讀取一個文件的文件流的話 這時候沒有必要這樣new咱們有簡單的方法
//FileStream fsRead= FileStream.OpenRead("a.txt") 當你調用OpenRead()這個方法的時候,
//它內部會給你new一個 FileStream對象;而且會初始化設置那些各類各樣的參數,省的咱們去設置了
//好比:OpenRead這個靜態方法源代碼是這樣的:
public static FileStream OpenRead(string path)
{
return new FileStream(path,FileMode.open,FileAccess.Read,FileShare.Read);
}
//好比:OpenWrite這個靜態方法的源代碼是這樣的:
public static FileStream OpenWrite(string path)
{
return new FileStream(path,FileMode.Write,FileAccess.Write,FileShare.None);
}
//可是若是你在循環裏面,你千萬別這樣用,由於他們每次調用OpenRead或OpenWrite 都會new一個對象,
//建議最好在循環外面建立一個對象來讀:好比這樣:FileStream fs=new FileStream(參數);
由於大文本文件也但願一點一點的來讀,若是用File.ReadAllText ,或者使用File.ReadAllLines來讀取,那麼它勢必會一下把大文本文件的整個內容都一次性讀到一個字符串,或字符串數組裏(其實都是先寫到 內存中的,這樣就會撐爆內存),而後寫到到另一個大文本文件中,這樣也就無法解決大文件讀取的問題。
那若是咱們用FileStream來讀取呢?,可是若是你要用FileSteam,就必需要把數據一次性讀取到一個byte[]數組裏,而後將這個字節數 組寫入到其餘的文本文件。它不能像其餘的大文件(主要這裏的大文件不是指大的文本文件)那樣讀一部分,寫入一部分,直到讀完整個大文件,和寫入整個大文 件。(例如;像電影這樣的大文件,我經過FileStream 來讀取,我讀一點寫一點,當我讀一點的時候,我記下了上次讀到第幾個字節,此次再從第幾個字節再讀取,至關於累加起來,最後組成一個電影)
可是對於文本文件來講就存在一個問題,好比說: 假如 a你好a你好a 是一個大文本文件,我想一點一點的來讀取這個大文本文件,因而我決定以4個字節爲一部分來讀(即讀完4個字節,就將它放入到byte[]數組中,而後將這 個byte[]數組寫入到一個字符串中,這樣問題就來了。咱們知道漢字是佔用兩個字節的,我如今要以4個字節爲一組來讀取 a你好a你好a 這個大文本文件, 當我讀到「好」的時候,發現這個「好」只讀到一半就已經滿4個字節了。而後將這4個字節寫入到字符串,但是這4個字節並不能組成 a你好 ,前面的a你 能夠組成,但是後面那個「好」卻組不成了,由於只有1個字節,而這1個字節經過轉碼的時候就亂碼了。)
而StreamRead 既能一點一點的來讀取文本文件,又能正常的讀取字符串來。它的內存裏始終只有一行的數據佔用,不會太佔用內存(StreamReaded與StreamWriter不適合文本文件外的大文件讀取,好比電影文件)
StreamRead 類有兩個方法
ReadToEnd () 用於從當前位置一直讀到最後,內容打的話會佔內存,每次調用都往下走,不能無心中調用了兩次
ReadLine() 一行一行的讀取,若是到了末尾,則返回null。
[csharp] view plaincopy
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StreamReaded與StreamWriter
{
class Program
{
static void Main(string[] args)
{
//StreamReader用來逐行讀取文本,直到文件的末尾
using (StreamReader sr = new StreamReader(@"D:\企業管理系統\Itcast.CMS\Itcast.CMS.WebApp\Itcast.CMS.WebApp.csproj",Encoding.Default))
{
//StreamWriter用來逐行寫入文本
using (StreamWriter sw = new StreamWriter(@"d:\wowo.txt",true,Encoding.Default))
{
// 獲取一個值,該值表示當前的流位置是否在流的末尾。
while (!sr.EndOfStream)
{
//將讀取到的字節數據寫入到d:\wowo.txt
sw.WriteLine(sr.ReadLine());
}
//或者下面這樣寫法
//string line = null;
//while ((line = sr.ReadLine()) != null)
//{
// sw.WriteLine(sr.ReadLine());
//}
}
}
Console.WriteLine("oK");
Console.ReadKey();
}
}
}