2015-11-19 127 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

相关问题