如何检查文件是不是存在于 Windows 应用商店应用程序中?

Posted

技术标签:

【中文标题】如何检查文件是不是存在于 Windows 应用商店应用程序中?【英文标题】:How to check if file exists in a Windows Store App?如何检查文件是否存在于 Windows 应用商店应用程序中? 【发布时间】:2012-01-27 09:38:20 【问题描述】:

有没有其他方法可以检查文件是否存在于 Windows 应用商店应用程序中?

try

    var file = await ApplicationData.Current.LocalFolder.GetFileAsync("Test.xml");
    //no exception means file exists

catch (FileNotFoundException ex)
 
    //find out through exception 

【问题讨论】:

【参考方案1】:

根据this post接受的答案,目前没有其他办法。但是,File IO 团队正在考虑更改 api,使其返回 null 而不是抛出异常。

引用链接帖子:

目前检查文件是否存在的唯一方法是捕获 FileNotFoundException。正如已经指出的那样,有一个明确的 检查并且开场是比赛条件,因此我不希望 有任何文件存在 API 的添加。我相信 File IO 团队 (我不在那个团队,所以我不确定,但这就是我所拥有的 听说)正在考虑让这个 API 返回 null 而不是抛出 如果文件不存在。

【讨论】:

我相信 Windows 8.1 中的新 IsAvailable 属性解决了这个问题。 @satur9nine - 谢谢,很高兴知道。我还没有机会研究 8.1 API。 ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName) 现在可以解决问题了。不再需要丑陋的异常处理。请记住,这也是一个等待呼叫。 不幸的是,Windows Phone 不存在该调用,因此如果您正在构建适用于 Windows 8.1/Windows Phone 8.1 的通用应用程序,那么您将不走运。我想我只需要将我的应用程序重新定位到 Windows 10....【参考方案2】:

这可能是旧的,但看起来他们已经改变了他们希望你处理这个的方式。

您应该尝试创建该文件,然后如果该文件已存在则返回。 Here 是上面的文档。我正在更新此内容,因为这是我在 Google 搜索此问题时的第一个结果。

所以,就我而言,我想打开一个文件,或者如果它不存在则创建它。我所做的是创建一个文件,如果它已经存在则打开它。像这样:

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists);

【讨论】:

这仅在您尝试创建具有唯一名称的文件时有效。如果您只是检查文件是否存在,那么显然您不想这样做。【参考方案3】:

我偶然发现了 Shashank Yerramilli 的这篇博文,它提供了一个更好的答案。

我已经在 windows phone 8 上测试过了,它可以工作。不过还没有在windows store上测试过

我在这里复制答案

对于 Windows RT 应用:

public async Task<bool> isFilePresent(string fileName)
 
    var item = await ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName);
    return item != null;
 

适用于 Windows Phone 8

 public bool IsFilePresent(string fileName)
 
     return System.IO.File.Exists(string.Format(@"0\1", ApplicationData.Current.LocalFolder.Path, fileName);
 

Check if a file exists in Windows Phone 8 and WinRT without exception

【讨论】:

"命名空间 'System.IO' 中不存在类型或命名空间名称 'File'(是否缺少程序集引用?)" 您尝试在什么应用类型中使用它:Windows Phone 8 或 Windows RT 应用? 面向 8.1 的通用 Windows / Phone 商店应用程序。此外,当您在这里时:您的 WP8 函数应该只返回一个布尔值,并且它也不需要 async 关键字。 感谢您让我知道更正,“File.Exists()”解决方案仅适用于 Window phone 8。“localFolder.TryGetItem()”方法适用于 Windows 8.1 部分通用应用程序。对于 windows phone 8.1 部分:您可以尝试 Billdr ***.com/a/12116839/2335882 的解决方案。 您链接到的答案不起作用,因为它返回一个文件是否存在(因为它在后一种情况下创建它)。【参考方案4】:

您可以像这样使用旧的 Win32 调用来测试目录是否存在:

GetFileAttributesExW(path, GetFileExInfoStandard, &info);

return (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? false: true;

它适用于桌面和 Metro 应用程序: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

【讨论】:

FILE_ATTRIBUTE_DIRECTORY 是从哪里来的?我测试了这个功能,它可以工作,但我不知道如何。谢谢!【参考方案5】:

微软在 Windows 8.1 中的 StorageFile 中添加了一个新功能,让用户工程师可以确定文件是否可以访问:IsAvailable

【讨论】:

Windows *Phone* 8.1 上不受支持,仅在 Windows 8.1 上受支持。我不知道MS在玩什么。【参考方案6】:

另一种检查方法是获取本地文件夹中的文件

    var collection =  ApplicationData.Current.LocalFolder.GetFilesAsync() 

使用此方法,然后遍历集合中的所有元素并检查其可用性。

【讨论】:

请检查您的大写锁定键。【参考方案7】:

我尝试使用旧技巧编写自己的代码:

    如果通过 FileOpenPicker 选择文件,GetFileAttributesEx() 似乎总是以 ERROR_ACCESS_DENIED 结束; FindFirstFileEx() 同上; 当通过 FileOpenPicker 选择文件时,_stat() 总是以 ENOENT 结尾; 带有 CREATE_NEW 选项的 CreateFile2() 有效 - 如果文件确实存在,它将失败并返回 INVALID_HANDLE_VALUE 值和 ERROR_FILE_EXISTS 最后一个错误;如果文件不存在,您必须记住之后删除创建的文件。

总而言之——你最好坚持使用异常处理方法。

【讨论】:

【参考方案8】:

8.1 有这样的东西,我试过了。

var folder = ApplicationData.Current.LocalFolder;
var file = await folder.TryGetItemAsync("mytext.txt") as IStorageFile;

if (file == null)

   //do what you want

else

   //do what you want

http://marcominerva.wordpress.com/2013/11/19/how-to-check-if-a-file-exists-in-a-windows-8-1-store-apps-no-more-exception-handling/

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案9】:
    Dim myPath As StorageFolder
    If (From i In Await KnownFolders.MusicLibrary.GetFoldersAsync() Where i.Name = "PodBong").Count = 1 Then
        myPath = Await KnownFolders.MusicLibrary.GetFolderAsync("PodBong")
    Else
        myPath = Await KnownFolders.MusicLibrary.CreateFolderAsync("PodBong")

    End If

【讨论】:

此代码将检查文件夹而不使用和异常。【参考方案10】:

TryGetItemAsync 的文档说:“这个例子展示了如何检查文件是否存在。”看来这个 API 是为了达到这个目的。

【讨论】:

以上是关于如何检查文件是不是存在于 Windows 应用商店应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从文本框(windows窗体)检查主键是不是存在于我的数据库中,c#

如何检查远程文件是不是存在于代理后面

Firebase 规则 - 如何检查用户是不是存在于子文档中

智能应用横幅;适用于 Android/Google Play 的 Windows 应用商店应用 HTML 元标记?

智能应用横幅;适用于 Android/Google Play 的 Windows 应用商店应用 HTML 元标记?

Java中如何检查文件是不是存在于目录中