操作檔案 - 引用 FileInfo 範例

接下來利用幾段程式碼說明上述各種方法的應用。
//
class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("輸入要建立的檔案完整目錄:");
            string path = Console.ReadLine();
            FileInfo finfo = new FileInfo(path);
            FileStream stream = finfo.Create();
            Console.WriteLine("完成檔案建立");
            Console.ReadKey();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
要求使用輸入要建立的檔案其對應的完整路徑字串,建立FileInfo物件,最後引用Create方法,建立指定路徑下的檔案。
輸入要建立的檔案完整目錄:
E:\FILEDEMO\Test.txt
完成檔案建立
指定要建立的新檔案Test.txt ,按下ENTER按鈕即可在路徑E:\FILEDEMO底下,建立此檔案。

如果指定的路徑不存在,則會出現找不到路徑的例外,執行結果如下:
輸入要建立的檔案完整目錄:
E:\DDDDDDE\xx.txt
找不到路徑 'E:\DDDDDDE\xx.txt' 的一部分。
我們持續來看刪除檔案的方法,以下這段程式碼示範Delete方法的實際引用。
class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("輸入要刪除的檔案完整路徑:");
            string path = Console.ReadLine();
            FileInfo finfo = new FileInfo(path);
            finfo.Delete();
            Console.WriteLine("完成檔案刪除");
            Console.ReadKey();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadKey();
        }
    }
}
其中建立FileInfo物件之後,引用Delete方法,將其行除,執行結果如下:
輸入要刪除的檔案完整路徑:
E:\FileDemo\test.txt
完成檔案刪除
當這個結果訊息出現,則text.txt檔案被刪除。

同樣的,必須注意指定的檔案路徑必須完成正確,否則將出現例外。

無論新增或是刪除檔案,都必須確認檔案是否存在,引用Exists屬性,如果回傳是true,表示檔案存在,false則不存在,透過判斷屬性值可以避免錯誤,我們進一步來看檔案的移動與複製。
//FileInfoMoveCopy
class Program
{
    static void Main(string[] args)
    {
        try
        {
            string amsg = "按任意鍵結束 !";
            Console.WriteLine("輸入要操作的檔案完整路徑:");
            string path = Console.ReadLine();
            FileInfo finfo = new FileInfo(path);
            if (finfo.Exists == true)
            {
                Console.WriteLine("輸入目標檔案完整路徑:");
                string dest = Console.ReadLine();
                Console.Write("1.複製 2.移動 : ");
                char a = Console.ReadKey().KeyChar;
                if (a == '1')
                {
                    finfo.CopyTo(dest);
                    amsg = "完成檔案複製," + amsg;
                }
                else if (a == '2')
                {
                    finfo.MoveTo(dest);
                    amsg = "完成檔案移動," + amsg;
                }
            }
            else
            {
                amsg = "檔案不存在," + amsg;
            }
            Console.WriteLine("\n{0}\n", amsg);
            Console.ReadKey();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadKey();
        }
    }
}
建立要操作的FileInfo物件finfo,引用Exists屬性以判斷是否存在,是的話,進行接下來的檔案移動或是複製作業。

If判斷式根據輸入的編號,如果是「1」,引用CopyTo方法,將FileInfo物件變數finfo參考的檔案,複製一份儲存至變數dest代表的目的路徑底下,並且依指定的檔名命名,如果編號是「2」,則直接移動檔案。
輸入要操作的檔案完整路徑:
E:\FILEDEMO\SUBA\filex.txt
輸入目標檔案完整路徑:
E:\FILEDEMO\SUBB\filey.txt
1.複製 2.移動 : 1
完成檔案複製,按任意鍵結束 !
以上是執行結果,其中選擇了「1」,因此SUBA資料夾底下的filex.txt會複製一份至SUBB資料夾,並以filey.txt作命名,如果選擇,則是動作業,因此原來SUBA資料夾底下的filex.txt會消失。

最後還要來看FileInfo物件本身,由於其參考某個路徑底下的特定檔案,可以透過屬性存取檔案相關資訊,程式碼列舉如下:
//FileInfoDemo
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("輸入要操作的檔案完整路徑:\n");
        string path = Console.ReadLine();
        FileInfo finfo = new FileInfo(path);
        //
        Console.WriteLine("\n");
        Console.WriteLine("檔案名稱:{0}", finfo.Name);
        Console.WriteLine("檔案副檔名:{0}", finfo.Extension);
        Console.WriteLine("檔案完整名稱:{0}", finfo.FullName);
        Console.WriteLine("檔案建立時間:{0}", finfo.CreationTime);
        Console.WriteLine("檔案最後存取時間:{0}", finfo.LastAccessTime);
        Console.WriteLine("檔案最後寫入時間:{0}", finfo.LastWriteTime);
        Console.WriteLine("\n");
        Console.WriteLine("按任意鍵結束 !");
        Console.ReadKey();
    }
}
以下顯示讀取的檔案資訊:
輸入要操作的檔案完整路徑:

E:\FILEDEMO\SUBA\filex.txt

檔案名稱:filex.txt
檔案副檔名:.txt
檔案完整名稱:E:\FILEDEMO\SUBA\filex.txt
檔案建立時間:2019/6/18 下午 05:32:11
檔案最後存取時間:2019/6/18 下午 05:33:24
檔案最後寫入時間:2019/6/18 下午 05:33:24

按任意鍵結束 !
如果想要擷取某個目錄底下的所有檔案,可以透過DirectoryInfo物件引用GetFiles方法,取得所有的FileInfo物件陣列,再透過上述的程式碼,以迴圈逐一取出即可,以下為範例程式碼:
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("輸入要操作的目錄路徑:\n");
        string path = Console.ReadLine();
        DirectoryInfo dinfo = new DirectoryInfo(path);
        //
        Console.WriteLine("\n");
        foreach (FileInfo finfo in dinfo.GetFiles())
        {
            Console.WriteLine("檔案名稱:{0}", finfo.Name);
            Console.WriteLine("\t檔案副檔名:{0}", finfo.Extension);
            Console.WriteLine("\t檔案完整名稱:{0}", finfo.FullName);
            Console.WriteLine("\t檔案建立時間:{0}", finfo.CreationTime);
            Console.WriteLine("\t檔案最後存取時間:{0}", finfo.LastAccessTime);
            Console.WriteLine("\t檔案最後寫入時間:{0}", finfo.LastWriteTime);
            Console.WriteLine("\n");
        }
        Console.WriteLine("按任意鍵結束 !");
        Console.ReadKey();
    }
}
執行這個範例並輸入要操作的目錄路徑,可以看到其中列舉指定目錄底下的所有檔案:
E:\FILEDEMO\SUBA

檔案名稱:filex00.txt
        檔案副檔名:.txt
        檔案完整名稱:E:\FILEDEMO\SUBA\filex00.txt
        檔案建立時間:2019/6/18 下午 05:32:11
        檔案最後存取時間:2019/6/18 下午 05:33:24
        檔案最後寫入時間:2019/6/18 下午 05:33:24

檔案名稱:filex01.txt
        檔案副檔名:.txt
        檔案完整名稱:E:\FILEDEMO\SUBA\filex01.txt
        檔案建立時間:2019/6/18 下午 10:33:30
        檔案最後存取時間:2019/6/18 下午 10:33:30
        檔案最後寫入時間:2019/6/18 下午 05:33:24

// ...
按任意鍵結束 !



沒有留言: