【问题标题】:How do I check if a file exists in a Windows Universal App如何检查文件是否存在于 Windows 通用应用程序中
【发布时间】:2016-02-22 08:08:27
【问题描述】:

我认为这会很简单,而且可能是这样,我只是在错误的地方寻找,但这是我尝试过的

我想检查一个文件是否存在。这是用户从FileOpenPicker 中选择的文件。所以,我需要能够检查他们选择的文件是否存在。在我的代码中,我只是设置了一个静态路径,以便我的编码示例保持简单。

请记住,这不适用于 windows phone,这是适用于 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;
    }
}

这总是返回 false。我尝试以多种方式设置文件名,但没有运气。我认为这是最接近正确的,但我无法走到最后。

试试 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();
    }
}  

这个方法基本相同,结果也一样。尝试TryGetItemAsync时它有FileNotFoundException

感谢任何帮助。我只想知道文件是否存在...

【问题讨论】:

    标签: c# win-universal-app


    【解决方案1】:

    你找错地方了。如果文件存在于搜索的文件夹中,您的两种方法都将起作用。这两个示例都正确失败,因为该文件在 InstalledLocation(尝试 1)或 LocalFolder(尝试 2)中不存在。

    您获得第一个方法的线程非常过时。当时捕捉异常是唯一的方法。从那时起,TryGetItemAsync 已被添加。

    StorageFolder.TryGetItemAsync 在您正在查看的 StorageFolder 对象中查找文件。请求的路径必须相对于文件夹:您不能传递完整路径来尝试查找不相关的文件。

    假设您的应用具有适当的文档文件夹功能,您可以从 KnownFolders.DocumentsLibrary 获取文档库文件夹,然后查找与该文件夹相关的文件:

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

    这里的一个主要警告是权限。 DocumentsLibrary 文件夹不适合一般用途,您的应用程序只能看到它在文档库中关联的类型的文件。除了使用文档库,您还可以使用文件选择器来选择在哪里查找文件,或者您可以将文件保存在 ApplicationData.LocalFolder 中,以便应用默认访问。

    【讨论】:

    • 感谢您的精彩回答。不过,我确实有一个后续问题。此应用程序旨在允许用户设置自己的文件位置。我正在使用FileOpenPickerWinddows.Storage.StorageFile 来获取他们想要使用的特定文件路径。有什么办法不必使用相对路径,因为我不能确定他们要选择的文件的位置?
    • 您需要使用相对路径,但您可以将用户选择的文件夹(假设它有路径 - 并非全部)与目标进行比较。该应用只能访问所选文件夹中的路径。
    • 以防万一其他人发现这个。这个问题讨论的很详细here
    猜你喜欢
    • 2012-01-27
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多