對於資料夾,文件的操作一直處於一知半解狀態,有時間閒下來了,好好練習了一把,對文件,檔案的操作有了一個基本的認知,
若要深入瞭解,還是得通過實際的專案才行了,好了廢話不多說,上酸菜!!
注:紅色標題為園友@李大菜鳥與@flyher補充的方法再次感謝
一 基本介紹
操作文件,資料夾,需要用到的類
1 Directory(靜態類) : 用於建立、移動和刪除等操作通過目錄和子目錄
DirectoryInfo(非靜態):
2 File(靜態類) :提供用於建立、複製、刪除、移動和開啟檔案的靜態類,並協助建立 FileStream 物件
FileInfo(非靜態)
3 StreamReader:實現一個 TextReader,使其以一種特定的編碼從位元組流中讀取字元
StreamWriter:實現一個 TextWriter,使其以一種特定的編碼向流中寫入字元
二 資料夾操作
操作資料夾用Directory 或者 DirectoryInfo
2.1 建立資料夾
1 string path = @"F:\TestFile"; 2 //建立資料夾 3 public void CreatFolder(string path) 4 { 5 if (Directory.Exists(path)) 6 { 7 Directory.Delete(path); 8 } 9 Directory.CreateDirectory(path); 10 11 }
2.2 刪除資料夾
1 string path = @"F:\TestFile"; 2 3 //刪除資料夾 4 public void DeleteFolder(string path) 5 { 6 //先刪除資料夾中所有檔案 7 DirectoryInfo directoryInfo = new DirectoryInfo(path); 8 foreach (var directory in directoryInfo.GetFiles()) 9 { 10 File.Delete(directory.FullName); 11 } 12 //資料夾必須為空 13 if (Directory.Exists(path)) 14 { 15 Directory.Delete(path); 16 } 17 }
2.3 移動資料夾
string path = @"F:\TestFile"; string newPath = @"F:\NewFile"; //移動資料夾 public void MoveFolder(string path, string newPath) { if (Directory.Exists(path)) { //移動包括資料夾在內的所有檔案 Directory.Move(path,newPath); } }
2.4 獲取資料夾下所有檔名
string path = @"F:\TestFile"; //獲取資料夾下所有檔名 public void GetFolderAllFiles(string path) { DirectoryInfo directory = new DirectoryInfo(path); var files = directory.GetFiles(); foreach (var file in files) { Console.WriteLine(file.Name); Console.WriteLine(file.FullName);//帶檔案路徑全名 } }
2.5 資料夾重新命名
其實與移動資料夾方法是一樣的,.net並沒有提供重新命名的方法,而是用新路徑替換原路徑以達到重新命名的交果
string name = @"F:\TestFile"; string newName = @"F:\NewFile"; //資料夾重新命名 public void Rename(string name ,string newName) { if (Directory.Exists(name)) { File.Move(name,newName); } }
2.6 獲取資料夾下所有資料夾名
string path = @"F:\TestFile"; //獲取路徑下所有資料夾 public void GetAllFolder(string path) { DirectoryInfo directory = new DirectoryInfo(path); DirectoryInfo[] allFolder = directory.GetDirectories();//返回當前目錄的子目錄(資料夾) foreach (var folder in allFolder) { Console.WriteLine(folder.Name); Console.WriteLine(folder.FullName);//帶全路徑的名稱 //還可以再遍歷子資料夾裡的檔案,或資料夾(最好用遞迴的方式) folder.GetDirectories(); } }
2.7 處理路徑得到檔名和檔案字尾
string path = @"F:\TestFile"; //處理路徑得到檔名和檔案字尾, public void FormatFile(string path) { DirectoryInfo directory = new DirectoryInfo(path); FileInfo[] files = directory.GetFiles(); foreach (var file in files) { string name = Path.GetFileNameWithoutExtension(file.Name);//取檔名 string extension = Path.GetExtension(file.Name);//取字尾名 Console.WriteLine("檔名:{0} 字尾名:{1}",name,extension); } }
2.8 判斷路徑是檔案或者資料夾(無效路徑返回0)
string path = @"F:\TestFile"; //判斷路徑是檔案或者資料夾(無效路徑返回0) public void IsFileOrFolder(string path) { DirectoryInfo directory = new DirectoryInfo(path); if (directory.Exists)//指定的目錄是否存在 Console.WriteLine("Folder"); else if (File.Exists(path))//指定的檔案是否存在 Console.WriteLine("File"); else Console.WriteLine("0"); }
三 文件操作(txt)
需要以下幾個類:Directory 或者DirectoryInfo ,File 或者 FileInfo
3.1 建立文件
string path = @"F:\TestFile\test.txt"; //建立文件 public void CreateFile(string path) { //檔案路徑用Directory判斷是否存在 if (Directory.Exists(path)) { //先刪除存在的檔案 if (File.Exists(path)) { File.Delete(path); } File.Create(path); } }
3.2 複製文件
string path = @"E:\TestFile\test.txt"; string newPath = @"E:\Test2File\newTest.txt"; //複製文件 public void CopyFile(string sourcePath, string destPath) { //只能針對同一卷軸(盤)下的檔案 //destPath 為要複製的新地址,(destPath指定的檔名必須是未建立的,執行Copy方法時才會建立該檔案) if (File.Exists(sourcePath)) { File.Copy(sourcePath, destPath); } }
3.3 移動文件
string path = @"E:\TestFile\test.txt"; string newPath = @"E:\Test2File\newTest.txt"; //移動文件 public void MoveFile(string SourcePath, string destPath) { //只能針對同一卷軸(盤)下的檔案 //destPath 為要移動的新地址(destPath指定的檔名必須是未建立的,執行Move方法時會將Source檔案移動到新地址可以重新命名) if (File.Exists(SourcePath)) { File.Move(SourcePath, destPath); } }
3.4 刪除文件
string path = @"E:\TestFile\test.txt"; //刪除文件 public void DeleteFile(string path) { if (File.Exists(path)) { File.Delete(path); } }
四 文件讀寫操作(文件流操作) 對 第三點 的擴充
需要以下類:FileStream 此類繼承了Stream 類並重寫了大部分方法,並提供多個帶參建構函式,注意:要讀取的目標流不是保持恆定的,而是每讀一次就會相應的減少,在練習時
沒注意,糾結了很久
4.1 寫入字元
string path = @"E:\TestFile\test.txt"; //往以有文件中寫入字元 public void CreateText(string path) { StreamWriter writer=File.CreateText(path); //直接寫入字元的write方法,每次寫入都會覆蓋之前的內容 writer.Write("你好!"); //把快取流的資料寫入到基礎流 writer.Flush(); //關閉StreamWriter物件及基礎流 writer.Close(); }
4.2 以流的形式寫入文件
//將一個檔案內的資料,以流的方式讀取,然後以流的形式寫入到另一個檔案中 public void ReadAndWriteFile() { string readPath = @"E:\TestFile\ReadStream.txt"; string writePath = @"E:\TestFile\WriteStream.txt"; //Read //開啟現有檔案以進行讀取 FileStream rs = File.OpenRead(readPath); byte[] buffer = new byte[rs.Length]; rs.Read(buffer, 0, buffer.Length); //將檔案內容讀到位元組流中 rs.Close(); //Write //開啟現有檔案以進行寫入 FileStream stream = File.OpenWrite(writePath); stream.Write(buffer, 0, buffer.Length); stream.Flush(); stream.Close(); }
4.3 以流的形式追加到文件
//將一個檔案內的資料,以流的方式讀取,然後以流的形式寫入到另一個檔案中(追加內容) public void ReadAndWriteNewFile() { string readPath = @"E:\TestFile\ReadStream.txt"; string writePath = @"E:\TestFile\WriteStream.txt"; //Read FileStream rd = File.Open(readPath,FileMode.Open); byte[] buffer = new byte[rd.Length]; rd.Read(buffer, 0, buffer.Length); rd.Close(); //Write FileStream wt = File.Open(writePath,FileMode.Append);//設為追加到原檔案中 wt.Write(buffer,0,buffer.Length); wt.Flush(); wt.Close(); }
4.4 讀取目標文件指定的一行資料
string paths = @"F:\TestFile\ReadStream.txt"; int readNum = 3; //讀取目標文字指定的某一行資料 public void ReadoneLine(string path,int readNum) { //可以迴圈讀每一行,然後到Add到集合中,再到集合中做處理 StreamReader reader = new StreamReader(path,Encoding.Default); var streamList = new List<string>(); int count=0; string lineText = string.Empty; while ((lineText = reader.ReadLine()) != null)//對於流的讀取每ReadLine一次流中就少一行,所直接在While用讀到的流做判斷,避免二次讀 { streamList.Add(lineText); } foreach (var item in streamList) { if (count == readNum - 1) { Console.WriteLine(item); } count++; } }
五 讀寫流操作文件
需要以下幾個類:StreamReader StreamWriter
5.1 字串讀取寫操作
//讀取文件並寫入到另一文件中(用字串寫入的方法) public void ReadFile() { string readPath = @"E:\TestFile\ReadStream.txt"; string writePath = @"E:\TestFile\WriteStream.txt"; using (StreamReader reader = new StreamReader(readPath,Encoding.Default)) //用預設的編碼格式(必須要轉格式否則亂碼) { var rd = reader.ReadToEnd(); StreamWriter writer = new StreamWriter(writePath,true,Encoding.UTF8);//需要轉成UTF-8的格式(可轉可不轉格式) writer.Write(rd); writer.Flush(); writer.Close(); } }
5.2 字元流讀寫操作
//用字元流的方式讀寫文件 public void ReadWriteByByte() { string readPath = @"F:\TestFile\ReadStream.txt"; string writePath = @"F:\TestFile\WriteStream.txt"; using (StreamReader reader = new StreamReader(readPath,Encoding.Default))//需要指定編碼,否則讀到的為亂碼 { #region 錯誤方法 //Read 注意:文字中的字元只能被讀取一次,第二次時讀取不到了 //var readStr =reader.ReadToEnd();//第一次讀取 //char[] buffer = new char[readStr.Length]; //reader.Read(buffer, 0, buffer.Length);//第二次讀取時,讀不到值 #endregion //Read char[] buffer = new char[10000]; reader.Read(buffer, 0, buffer.Length); //Write StreamWriter writer = new StreamWriter(writePath,true,Encoding.UTF8); writer.Write(buffer, 0, buffer.Length); writer.Flush(); writer.Close(); }
六 總結
本文只對以上幾個類常用的方法簡單的介紹了,也是掃了下自己的盲區,如有更好的建議或方法,請指出。
另外如果覺得本文對你有一點小小的幫助不妨點下推薦,您的推薦是我寫作的動力!!