2009-11-15 89 views
1

我需要做一個檢查,看看文件是否存在,他們的輸入,我怎麼能做到這一點,我嘗試使用嘗試&漁獲物和它沒有任何效果如何捕捉異常並繼續程序? C#

if (startarg.Contains("-del") == true) 
      { 
       //Searches "Uninstallers" folder for uninstaller containing the name that they type after "-del" and runs it 
       string uninstalldirectory = Path.Combine(Directory.GetCurrentDirectory(), "Uninstallers"); 
       DirectoryInfo UninstallDir = new DirectoryInfo(uninstalldirectory); 
       string installname = startarg[2].ToString(); 
       //Removes file extesion "-del " 
       installname.Remove(0, 5); 
       string FullFilePath = Path.Combine(uninstalldirectory, installname); 
       try 
       { 
        //Makes the uninstaller invisible to the user and sets other settings 
        Process Uninstaller = new Process(); 
        Uninstaller.StartInfo.FileName = FullFilePath; 
        Uninstaller.StartInfo.UseShellExecute = false; 
        Uninstaller.StartInfo.CreateNoWindow = true; 
        Uninstaller.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
        Uninstaller.Start(); 
       } 
       //Only is run if the package isn't installed 
       catch (System.Exception) 
       { 
        Console.WriteLine("The specified package is not installed, you most likely mispelled it or didnt put quotes around it, try again"); 
       } 

      } 

該代碼的絕大部分是獲得當前目錄並添加「卸載程序」。

編輯: 調試結果是ArgumentOutOfRangeException

我使用File.Exists if語句和else嘗試,它仍然崩潰

編輯#2:什麼

只是有點我與這個程序有關:我試圖編寫一個跨平臺(使用mono,還沒有移植它,因爲我不喜歡MonoDevelop)包管理器,這是它的功能,它刪除包。它通過在應用程序的Uninstallers文件夾中獲取卸載腳本來獲取已安裝應用程序的列表。我希望它是獨立的目錄,所以我必須得到它的當前目錄

我的代碼工作正常,如果該文件存在,但是當它不崩潰這就是我的問題

+2

當你運行這個命令時,你看到了什麼結果,指定一個不存在的文件? 「它沒有效果」是什麼意思? – 2009-11-15 23:58:36

+0

@lndebi,將你的評論拼湊在一起,你會在'string FullFilePath ...'行得到'ArgumentOutOfRange'異常。查看我答案中的第一個項目符號,以解決您的緊急問題。 – 2009-11-16 00:47:27

+0

...和詹姆斯的答案直接解決它。 – 2009-11-16 00:50:27

回答

3

try-catch沒有效果,因爲異常被try塊外的代碼拋出。正如其他人指出的那樣,您可以對代碼進行一些改進,以便在真正異常的情況下調用異常處理。

3

這是不好的初步實踐依賴關於正常處理的例外情況。您可以使用File.Exists() function來檢查文件是否存在,以及它是否不寫入警報並允許它們選擇另一個文件。所以它可能看起來像

if(File.Exists(FullFilePath)) 
{ 
    //uninstall 
} 
else 
{ 
    Console.WriteLine("The specified package is not installed, you most likely mispelled it or didnt put quotes around it, try again"); 
} 
+0

我改變後,它仍然崩潰 – 2009-11-16 00:09:22

+0

@ lndebi:崩潰在哪裏?在什麼情況下,什麼是例外? – 2009-11-16 00:11:21

+0

它崩潰在 字符串FullFilePath = Path.Combine(uninstalldirectory,installname); – 2009-11-16 00:12:44

6

你還沒有指定你看到的結果,所以你的問題很難診斷。我可以看到一些可能出現的問題,雖然:

  • Path.Combine可以拋出異常 如果它的參數包含路徑無效字符 。您還沒有 在 包裹您的Path.Combine調用try-catch塊。
  • 如果你的代碼需要在給定路徑的文件或目錄 存在, 你最好檢查與 一個 File.ExistsDirectory.Exists 調用,而不是依賴於一個 例外。 Joel Coehoorn在他的評論中提到了一個很好的觀點,就使用File.Exists時的競爭條件而言。
  • 從您的 命令行參數中剝離「-del」是一種相當容易出錯的方式來處理參數。 是否有任何理由,你不能簡單地 期望指令(「-del」)爲 第一個參數,並且 的路徑是第二個參數?

編輯:其他地方閱讀您的答覆後,我看到了另一個問題:

//Removes file extesion "-del " 
installname.Remove(0, 5); 

這不會做你認爲它。你需要該行的結果分配回installName

installname = installname.Remove(0, 5); 

我也很擔心,你期待一個指令和路徑以某種方式結合到你的第三個命令行參數。如果調用應用程序,像這樣:

myapp.exe foo bar -del "C:\myfile.txt" 

,您的命令行參數看起來像下面這樣:

args[0] // foo 
args[1] // bar 
args[2] // -del 
args[3] // C:\myfile.txt 

換句話說,「-del」和你的文件路徑將會在單獨參數。

+0

我不想讓它執行另一個程序,我正在編寫一個跨平臺的軟件包管理器(很快將它移植到單聲道),這是刪除已安裝軟件包的一部分。我希望用戶能夠輸入simtho -del「Mozilla Firefox」,它會刪除Mozilla Firefox。不要擔心它的很多細節,我主要介紹了它,只是請幫助我解決這個問題 – 2009-11-16 00:32:39

+1

坦率地說,lndebi,你的代碼中充滿了錯誤,你需要詳細說明它的細節,我會以任何合理的方式工作。有沒有任何理由讓我回答我所問的調試問題? – 2009-11-16 00:35:28

+0

您的第二個項目符號錯誤,因爲文件系統是_volatile_,這意味着您可以刪除文件或在您檢查和嘗試使用該文件時權限發生變化。無論如何,您必須能夠處理異常,因此.Exists()調用只是額外的。 – 2009-11-16 00:55:21