Как проверить, существует ли файл в приложении Магазина Windows? - PullRequest
48 голосов
/ 24 декабря 2011

Есть ли другой способ проверить, существует ли файл в приложении Магазина Windows?

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

Ответы [ 10 ]

26 голосов
/ 24 декабря 2011

Согласно принятому ответу в этом посте , на данный момент другого пути нет. Тем не менее, команда File IO рассматривает возможность изменения api, чтобы он возвращал null вместо того, чтобы выдавать исключение.

Цитата из связанного поста:

В настоящее время единственный способ проверить, существует ли файл, это поймать FileNotFoundException. Как уже указывалось, наличие явного проверка и открытие является условием гонки, и поэтому я не ожидаю там, чтобы быть любой файл существует API добавлен. Я считаю, что команда File IO (Я не в этой команде, поэтому я не знаю точно, но это то, что я слышал) рассматривает возможность возврата этого API вместо NULL если файл не существует.

13 голосов
/ 25 августа 2012

Это может быть старым, но похоже, что они изменили то, как они хотят, чтобы вы подошли к этому.

Вы должны попытаться создать файл, а затем отступить, если файл уже существует. Здесь - документация по нему.Я обновляю это, потому что это был первый результат в моем поиске Google для этой проблемы.

Итак, в моем случае я хочу открыть файл или создать его, если он не существует.Я создаю файл и открываю его, если он уже существует.Вот так:

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists);
8 голосов
/ 08 марта 2014

Я наткнулся на это сообщение в блоге Шашанка Йеррамилли, которое дает гораздо лучший ответ.

Я проверил это для 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);
 }

Проверьте, существует ли файл в Windows Phone 8 и WinRT без исключения

3 голосов
/ 04 сентября 2013

Microsoft добавила новую функцию в StorageFile в Windows 8.1, чтобы инженеры-пользователи могли определить, можно ли получить доступ к файлу: IsAvailable

3 голосов
/ 03 июля 2012

Вы можете использовать старый вызов Win32 следующим образом, чтобы проверить, существует ли каталог:

GetFileAttributesExW(path, GetFileExInfoStandard, &info);

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

Работает в приложениях Desktop и Metro: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

2 голосов
/ 06 сентября 2012

Другой способ проверки - получение файлов в локальной папке

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

Используя этот метод, а затем перебирая все элементы в коллекции и проверяйте ее доступность.

1 голос
/ 11 августа 2015
    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
1 голос
/ 27 ноября 2014

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/

1 голос
/ 07 июня 2012

Я пытался написать свой, используя старые трюки:

  1. GetFileAttributesEx () всегда завершается ошибкой ERROR_ACCESS_DENIED, если файл выбран с помощью FileOpenPicker;
  2. То же самое для FindFirstFileEx ();
  3. _stat () всегда заканчивается ENOENT, когда файл выбран с помощью FileOpenPicker;
  4. CreateFile2 () с опцией CREATE_NEW работает - если файл существует, он потерпит неудачу с возвращаемым значением INVALID_HANDLE_VALUE и последней ошибкой ERROR_FILE_EXISTS; если файл не существует, вы должны не забыть удалить созданный файл впоследствии.

В целом - лучше придерживаться метода обработки исключений.

0 голосов
/ 09 мая 2014

Документация для TryGetItemAsync гласит: «Этот пример показывает, как проверить наличие файла».Похоже, что этот API официально предназначен для этой цели.

...