如何在Windows Store应用程序中检查文件是否存在?

48

有没有其他方法可以检查 Windows Store 应用中是否存在某个文件?

try
{
    var file = await ApplicationData.Current.LocalFolder.GetFileAsync("Test.xml");
    //no exception means file exists
}
catch (FileNotFoundException ex)
{ 
    //find out through exception 
}
10个回答

26

根据此帖的被接受答案,目前没有其他方式。但是,文件IO团队正在考虑更改API,以使其返回null而不是抛出异常。

引用链接帖子中的内容:

目前唯一检查文件是否存在的方法是捕获FileNotFoundException。正如已经指出的那样,显式检查和打开操作是竞态条件,因此我不认为会添加任何文件存在的API。我相信文件IO团队(我不在该团队中,所以我不确定,但这是我听到的)正在考虑如果文件不存在,则使此API返回null而不是抛出异常。


2
我相信Windows 8.1中的新IsAvailable属性解决了这个问题。 - satur9nine
@satur9nine - 谢谢,这很有用。我还没有机会研究8.1的API。 - keyboardP
4
现在可以使用ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName)来解决问题了,不再需要丑陋的异常处理。请记住,这也是一个可等待的调用。 - RBT
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Levi Fuller

13

可能这篇文章有点陈旧了,但看起来他们已经改变了你应该如何处理这个问题的方式。

你应该尝试创建文件,如果文件已经存在则回退。可以在这里查看相关文档。我更新这篇文章是因为它是我谷歌搜索这个问题时的第一个搜索结果。

所以,在我的情况下,我想打开一个文件,如果不存在则创建它。我的做法是,先创建文件,如果文件已经存在则打开它。就像这样:

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

4
只有当您想创建具有唯一名称的文件时,此方法才有效。如果您只是检查文件是否存在,显然不需要这样做。 - chue x

8

我偶然发现了Shashank Yerramilli的博客文章,提供了一个更好的解决方案。

我已经在Windows Phone 8上测试过它并且可以正常工作。但是还没有在Windows商店上测试过。

我将答案复制在此处。

对于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);
 }

在Windows Phone 8和WinRT中检查文件是否存在而不抛出异常

这篇文章介绍了如何检查Windows Phone 8和WinRT中的文件是否存在,而无需抛出异常。该方法使用TryGetItemAsync()方法来搜索文件,并根据返回值判断文件是否存在。此外,还提供了示例代码以帮助读者更好地理解如何实现。

“File” 类型或命名空间在命名空间 “System.IO” 中不存在(是否缺少程序集引用?) - Mike
你正在尝试在哪种应用中使用它:Windows Phone 8 还是 Windows RT 应用程序? - Jap
一个面向8.1的通用Windows/Phone商店应用程序。 另外,既然你在这里了:你的WP8函数只需要返回一个布尔值,也不需要async关键字。 - Mike
感谢您告诉我更正的信息。'File.Exists()'解决方案仅适用于Windows Phone 8。'localFolder.TryGetItem()'方法将在通用应用程序的Windows 8.1部分中起作用。对于Windows Phone 8.1部分:您可以尝试Billdr的解决方案https://dev59.com/1Goy5IYBdhLWcg3wUcf_#12116839。 - Jap
你链接的答案行不通,因为它无论文件是否存在都会返回一个文件(因为它在后一种情况下创建了一个文件)。 - Mike
很奇怪他们从Windows Phone 8.1中删除了File.Exists(),我猜现在唯一的方法就是尝试打开文件并捕获异常。 - Jap

3

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


仅支持在Windows 8.1上,不支持在Windows Phone 8.1上。我不知道微软在搞什么鬼。 - Albus Dumbledore

3

这里的FILE_ATTRIBUTE_DIRECTORY是从哪里来的?我测试了这个函数,它可以工作,但我不知道为什么。谢谢! - Justin R.

2
另一种检查方法是获取本地文件夹中的文件。
    var collection =  ApplicationData.Current.LocalFolder.GetFilesAsync() 

使用此方法,然后迭代集合中的所有元素并检查其是否可用。

9
请检查您的大写锁定键。 - ЯegDwight

1
    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

这段代码将检查文件夹而不使用异常。 - HippieGeek

1

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - Andrey Korneyev

1

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

  1. 如果通过FileOpenPicker选择文件,则GetFileAttributesEx()似乎总是以ERROR_ACCESS_DENIED结束;
  2. FindFirstFileEx()也是如此;
  3. 如果通过FileOpenPicker选择文件,则_stat()总是以ENOENT结束;
  4. 使用CREATE_NEW选项的CreateFile2()可以工作--如果文件存在,它将失败并返回INVALID_HANDLE_VALUE和ERROR_FILE_EXISTS错误;如果文件不存在,则必须记得删除创建的文件。

总之,最好坚持异常处理方法。


0

TryGetItemAsync 的文档中写道,“此示例演示了如何检查文件的存在性。” 看起来这个 API 官方上打算用于这个目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接