如何检查Windows应用商店应用中是否存在文件?

时间:2011-12-24 17:51:53

标签: c# windows-8 windows-runtime microsoft-metro filenotfoundexception

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

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

10 个答案:

答案 0 :(得分:26)

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

来自链接帖子的引用:

  

目前检查文件是否存在的唯一方法是捕获   FileNotFoundException异常。正如已经指出的那样明确   检查和开放是一个竞争条件,因此我没想到   有任何文件存在API添加。我相信File IO团队   (我不在那支球队,所以我不确定,但这就是我的意思   听到)正在考虑让这个API返回null而不是抛出   如果文件不存在。

答案 1 :(得分:13)

这可能已经过时了,但看起来他们已经改变了他们希望你接近它的方式。

你应该尝试制作文件,如果文件已经存在则返回。 Here是关于它的文档。我正在更新此信息,因为这是我在Google上搜索此问题的第一个结果。

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

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

答案 2 :(得分:8)

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

我已经为Windows Phone 8测试了这个并且它可以工作。尚未在Windows商店中测试过

我在这里复制答案

对于Windows RT app:

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

答案 3 :(得分:3)

您可以像这样使用旧的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

答案 4 :(得分:3)

Microsoft已在Windows 8.1中向StorageFile添加了一项新功能,以允许用户工程师确定是否可以访问文件:IsAvailable

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

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

    如果通过FileOpenPicker选择文件,
  1. GetFileAttributesEx()似乎总是以ERROR_ACCESS_DENIED结束;
  2. 同上FindFirstFileEx();
  3. 当通过FileOpenPicker; 选择文件时,
  4. _stat()始终以ENOENT结束
  5. 使用CREATE_NEW选项的CreateFile2()工作 - 如果文件确实存在,它将失败,返回值为INVALID_HANDLE_VALUE,ERROR_FILE_EXISTS为最后一个错误;如果文件不存在,则必须记住之后删除创建的文件。
  6. 总而言之 - 你最好坚持使用异常处理方法。

答案 7 :(得分:1)

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/

答案 8 :(得分: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

答案 9 :(得分:0)

TryGetItemAsync的文档说:“此示例显示了如何检查文件是否存在。”似乎这个API正式用于此目的。