2017-11-25 374 views
0

我有以下代碼:吃異常或檢查null?

private async Task <string>IsolatedStorageReadTextFile(string uFileName) 
{ 
     string sRet = ""; 

     StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName); 
     if (file != null) 
     { 
      using (var inputStream = await file.OpenReadAsync()) 
      using (var classicStream = inputStream.AsStreamForRead()) 
      using (var streamReader = new StreamReader(classicStream)) 
      { 
       while (streamReader.Peek() >= 0) 
       { 
        sRet = streamReader.ReadLine(); 
       } 
      } 
     } 
     return sRet; 
} 

當有問題的文件不存在,IDE將拋出一個錯誤:

enter image description here

我應該

1)讓IDE調試華納忽略這個錯誤(說「不要打破這個異常」),我應該讓「if(file!= null)」做這個工作

2)或者我應該檢查文件是否真的存在

3)使用try-catch?

我不得不根據答案添加的代碼的重要組成部分:

private async Task <bool> LocalExists(string uFileName) 
    { 
     bool b = false; 
     //https://stackoverflow.com/questions/8626018/how-to-check-if-file-exists-in-a-windows-store-app 
     try 
     { 
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName); 
      b = (file != null); 
     } 
     catch (Exception ex) 
     { 
      b = false; 
     } 

     return b; 
    } 

這將引發同樣的異常,因爲在UWP,似乎有檢查沒有別的辦法,如果一個文件不是試圖訪問實際存在它:

How to check if file exists in a Windows Store App?

所以問題仍然存在。

+0

切勿使用異常來驅動你的代碼流。調用之前的File.Exists將避免很多麻煩。 (不是100%安全,但仍然....) – Steve

回答

1

您既可以檢查之前存在的文件,也可以處理異常。

當你沒有捕捉到異常,下一行將不會被執行,因此你不能檢查文件爲空(不像其他編程語言,如C++)。

這個選項不要在這個選項上打破,只有當只拋出異常時不會暫停(激活一個斷點)應用程序,不會改變程序的行爲。

+1

我想補充一點,檢查文件是否存在意味着簡單地嘗試訪問它:https://stackoverflow.com/questions/8626018/how-to-check-if -file-exists-a-windows-store-app,所以在任何情況下都需要try-catch,我想。 – tmighty

+0

這隻適用於Windows應用商店。您可以通過https://msdn.microsoft.com/en-us/library/system.io.file來檢查文件是否存在。存在(v = vs.110).aspx –

+1

我正在處理UWP。你是說當你說「Windows Store App」時,對嗎? – tmighty

2

您應該檢查文件是否存在,除非它始終存在,例如,因爲它是你程序的一部分。儘管如此,你應該使用try catch來捕捉整個事物,因爲即使文件存在,它也可能被鎖定或者可能發生不同的讀取錯誤。

2

在你提出的三種解決方案中(忽略錯誤,首先檢查文件是否存在,或者捕獲異常),只有捕獲異常纔有效。忽略異常會讓應用崩潰。在調用GetFileAsync之前檢查文件是否存在有一個時間問題,在該文件可能在檢查之後但在打開文件之前被刪除。

第四個也是最好的解決方案是使用StorageFile.TryGetItemAsync在文件存在的情況下返回文件,否則返回null。

StorageFile file = await ApplicationData.Current.LocalFolder.TryGetItemAsync(uFileName) as StorageFile; 
if (file != null) 
{ 
    //... 
} 

鏈接的線程它說有沒有辦法來檢查是正確的Windows Store應用程序在2011年它已經過時了UWP的應用程序在2017年