none
發生例外情況停止程式執行 RRS feed

  • 問題

  • 各位高手您好

    我現在在做一個複製資料夾程式

    我需要複製多個不同路徑的資料夾到同一個路徑下

    這是我從網路上找的 複製附錄的方法

       private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
        {
            // Get the subdirectories for the specified directory.
            DirectoryInfo dir = new DirectoryInfo(sourceDirName);
    
            if (!dir.Exists)
            {
                throw new DirectoryNotFoundException(
                    "Source directory does not exist or could not be found: "
                    + sourceDirName);
            }
    
            DirectoryInfo[] dirs = dir.GetDirectories();
            // If the destination directory doesn't exist, create it.
            if (!Directory.Exists(destDirName))
            {
                Directory.CreateDirectory(destDirName);
            }
            
            // Get the files in the directory and copy them to the new location.
            FileInfo[] files = dir.GetFiles();
            foreach (FileInfo file in files)
            {
                string temppath = Path.Combine(destDirName, file.Name);
                file.CopyTo(temppath, false);
            }
    
            // If copying subdirectories, copy them and their contents to new location.
            if (copySubDirs)
            {
                foreach (DirectoryInfo subdir in dirs)
                {
                    string temppath = Path.Combine(destDirName, subdir.Name);
                    DirectoryCopy(subdir.FullName, temppath, copySubDirs);
                }
            }
        }

    上面 if (!dir.Exists) 會跳出錯誤訊息並且告知

    "Source directory does not exist or could not be found: "+ sourceDirName

    我想要去改寫成 如果沒有發現某個複製source資料夾的路徑或是有路徑有問題的話

    那我就要立即停止程式執行 

    假設: A B C D 為四個source資料夾的路徑

    我要複製到的資料夾為 E:\test

    當我依序複製到 C 這個資料夾時發現C的路徑有問題

    那我要如何去停止程式執行並且跳出Form2

    且不會繼續複製D這個資料夾

    請問應該如何改寫

    拜託各位高手不吝嗇指教初學者  感謝!

    2018年3月21日 上午 03:56

所有回覆

  • 您可以將

    if (!dir.Exists)

    改成:

    if(Directory.Exists(sourceDirName))

    再試看看

    2018年3月21日 上午 08:21
  • 不知道我有沒有誤解的你的意思,基本上應該不是改寫 DirectoryCopy,

    而是使用它,寫了一些程式碼給你參考(沒有實際運行過,只是提供一個框架給你參考):

    private static void CopyFolders()
    {
        var srcDirNameList = new List<string> {"A", "B", "C", "D"};
        foreach (var srcDirName in srcDirNameList)
        {
            try
            {
                DirectoryCopy(srcDirName, @"E:\test", true);
            }
            catch (IOException e)
            {//還有各種可能的例外狀況,可參考:https://msdn.microsoft.com/zh-tw/library/f0e105zt(v=vs.110).aspx
                var form = new Form2();
                form.ShowDialog();
                break;
            }
        }
    }

    希望這是你要的~

    2018年3月21日 上午 08:23
  • 如果這應該是一個正常流程,我的看法是應該改寫 DirectoryCopy 的內容,而不是依賴例外來決定流程方向。

    例外處理是一種不得已的手段,也是一個影響效能的手段,除非有必要,否則能夠避免使用例外作為流程方向的決定還是盡量避免的好。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2018年3月23日 上午 02:56
    版主
  • 支持 Bill Chung 的看法,你可以修改一下 DirectoryCopy() 加上一個像 bool stopIfErrorOccurred 的參數設定允不允許發生錯誤時繼續作業。

    然後在例外中判斷這個值,如果是 false 就繼續,是 true 就中斷。

    因為例外百百種,而且同一個例外可能還有不同的意思,你不可能每種都看啊...


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2018年3月31日 上午 12:15
    版主