2015-11-19 96 views
1

我以爲這將是非常簡單的存在,它可能是,和我只是找錯了地方,但這裏是我已經試過如何檢查文件是否在Windows通用應用程序

我想檢查一個文件是否存在。這是用戶從FileOpenPicker中選擇的文件。所以,我需要能夠檢查他們選擇的文件是否存在。在我的代碼中,我只是設置了一個靜態路徑,這樣我的代碼示例就保持簡單。

請記住,這不是爲Windows手機,這是一個Windows 8.1桌面應用

嘗試1

here

private async void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    if (await DoesFileExistAsync("C:\\Users\\username\\Documents\\testFiles\\testFile.docx")) 
     { 
      var checkboxDialog = new MessageDialog("exists"); 
      await checkboxDialog.ShowAsync(); 
     } 
     else 
     { 
      var nopeDialog = new MessageDialog("doesn't exist"); 
      await nopeDialog.ShowAsync(); 
     } 
} 
async Task<bool> DoesFileExistAsync(string fileName) 
{ 
    try 
    { 
     //This was originally just await FolderPicker.GetFileAsync(fileName), but it didn't compile. 
     await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(fileName); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

這總是返回假。我試過用很多方式設置文件名,但沒有運氣。我認爲這是最接近正確的,但我不能走到最後。

TRY 2

here

private async void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    var folder = ApplicationData.Current.LocalFolder; 
    var file = await folder.TryGetItemAsync("C:\\Users\\username\\Documents\\testFiles\\testFile.docx"); 

    if (file != null) 
    { 
     var checkboxDialog = new MessageDialog("exists"); 
     await checkboxDialog.ShowAsync(); 
    } 
    else 
    { 
     var nopeDialog = new MessageDialog("doesn't exist"); 
     await nopeDialog.ShowAsync(); 
    } 
} 

該方法基本上是相同的,並具有相同的結果。它有FileNotFoundException當試圖TryGetItemAsync

任何幫助表示讚賞。我只想知道文件是否存在...

回答

2

你正在看錯了地方。如果該文件存在於搜索的文件夾中,則兩種方法都可以使用。這兩個示例都正確失敗,因爲文件不存在於InstalledLocation(try 1)或LocalFolder(try 2)中。

您從第一種方法獲得的線程已過時。捕捉異常是唯一的方法。 TryGetItemAsync自那時起一直添加。

StorageFolder.TryGetItemAsync在您正在查看的StorageFolder對象內查找文件。請求的路徑必須與該文件夾相關:您無法傳遞完整路徑以嘗試查找不相關的文件。

假設您的應用程序具有適當的文檔文件夾功能,您可以從KnownFolders獲取文檔庫文件夾。 DocumentsLibrary然後查找文件相對於文件夾:

StorageFolder docs = KnownFolders.DocumentsLibrary; 
StorageFile file = docs.TryGetItemAsync("testFiles\\testFile.docx"); 

這裏主要需要注意的是權限。 DocumentsLibrary文件夾不適合一般用途,您的應用程序只能看到它在文檔庫中關聯的文件類型。您可以使用文件選擇器來選擇要查找文件的位置,而不必使用文檔庫,也可以將文件保留在ApplicationData.LocalFolder中,以便默認情況下應用程序具有訪問權限。

+0

謝謝你的精彩答案。我確實有一個後續問題。此應用程序旨在允許用戶設置自己的文件位置。我使用''FileOpenPicker'''和''Winddows.Storage.StorageFile'''來獲得他們想要使用的特定文件路徑。有沒有辦法不必使用相對路徑,因爲我不能確定他們將要選擇的文件的位置? – trueCamelType

+0

您需要使用相對路徑,但您可以比較用戶選擇的文件夾(假設它有一條路徑 - 並非全部都是這樣)與目標。該應用只能訪問拾取文件夾中的路徑。 –

+0

以防其他人發現此情況。這個問題在[這裏]詳細討論(http://stackoverflow.com/questions/3137097/how-to-check-if-a-string-is-a-valid-windows-directory-folder-path)。 – trueCamelType

相關問題