Как проверить, существует ли файл в приложении Windows Store?

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

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

Ответ 1

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

Цитата из связанного сообщения:

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

Ответ 2

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

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

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

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

Ответ 3

Я наткнулся на это сообщение в блоге 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 без исключений

Ответ 4

Вы можете использовать старый вызов 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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 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 официально предназначен для этой цели.