操作檔案方法簡單總結(File,Directory,StreamReader,StreamWrite )

Zery發表於2013-09-13

       對於資料夾,文件的操作一直處於一知半解狀態,有時間閒下來了,好好練習了一把,對文件,檔案的操作有了一個基本的認知,

若要深入瞭解,還是得通過實際的專案才行了,好了廢話不多說,上酸菜!!

 注:紅色標題為園友@李大菜鳥與@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);
            }
        }
View Code

   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();
            }
展開程式碼

 

 

六 總結

     

       本文只對以上幾個類常用的方法簡單的介紹了,也是掃了下自己的盲區,如有更好的建議或方法,請指出。

另外如果覺得本文對你有一點小小的幫助不妨點下推薦您的推薦是我寫作的動力!!

 

相關文章