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

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

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

person Haris Hasan    schedule 24.12.2011    source источник


Ответы (10)


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

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

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

person keyboardP    schedule 24.12.2011
comment
Я считаю, что новое свойство IsAvailable в Windows 8.1 решает эту проблему. - person satur9nine; 04.09.2013
comment
@satur9nine - Спасибо, приятно знать. У меня еще не было возможности изучить API 8.1. - person keyboardP; 06.09.2013
comment
Теперь ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName) может помочь. Больше не требуется уродливая обработка исключений. Пожалуйста, помните, что это также ожидаемый звонок. - person RBT; 06.04.2015
comment
К сожалению, этот вызов не существует для Windows Phone, поэтому вам не повезло, если вы создаете универсальное приложение для Windows 8.1/Windows Phone 8.1. Думаю, мне просто нужно перенастроить свое приложение на Windows 10.... - person Levi Fuller; 22.06.2015

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

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

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

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists);
person Billdr    schedule 24.08.2012
comment
Это работает, только если вы пытаетесь создать файл с уникальным именем. Если вы просто проверяете наличие файла, то, очевидно, вы не захотите этого делать. - person chue x; 11.06.2013

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

Я проверил это для 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 без исключения

person Jap    schedule 08.03.2014
comment
Имя типа или пространства имен «Файл» не существует в пространстве имен «System.IO» (вам не хватает ссылки на сборку?) - person Mike; 07.08.2014
comment
В каком типе приложения вы пытаетесь его использовать: Windows Phone 8 или приложение Windows RT? - person Jap; 07.08.2014
comment
Универсальное приложение для магазина Windows/Phone, ориентированное на 8.1. Кроме того, пока вы здесь: ваша функция WP8 должна просто возвращать логическое значение, и ей также не нужно ключевое слово async. - person Mike; 07.08.2014
comment
Спасибо, что сообщили мне об исправлении. Решение «File.Exists()» работает только в Windows Phone 8. Метод «localFolder.TryGetItem()» будет работать в части универсального приложения Windows 8.1. Для части Windows Phone 8.1: вы можете попробовать решение Billdr stackoverflow.com/a/12116839/2335882. - person Jap; 08.08.2014
comment
Ответ, на который вы ссылаетесь, не будет работать, поскольку он возвращает файл независимо от того, существует он или нет (потому что он создает его в последнем случае). - person Mike; 08.08.2014
comment
Странно, что они удалили File.Exists() из Windows Phone 8.1, я думаю, сейчас единственный способ - попытаться открыть файл и поймать исключение. - person Jap; 09.08.2014

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

person Michael Wildermuth    schedule 02.07.2012
comment
Откуда здесь FILE_ATTRIBUTE_DIRECTORY? Я проверил эту функцию, и она работает, но я не понимаю, как это сделать. Спасибо! - person Justin R.; 23.05.2014

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

person satur9nine    schedule 04.09.2013
comment
Не поддерживается в Windows *Phone* 8.1, только в Windows 8.1. Я не знаю, во что играет MS. - person Albus Dumbledore; 02.05.2016

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

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

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

person Anobik    schedule 06.09.2012
comment
Пожалуйста, проверьте ключ Caps Lock. - person ЯegDwight; 06.09.2012

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

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

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

person Galadrius Krunthar    schedule 07.06.2012

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-больше-обработка-исключений/

person canbax    schedule 27.11.2014
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Andy Korneyev; 27.11.2014

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

person Thaine Norris    schedule 09.05.2014

person    schedule
comment
Этот код будет проверять папку без использования и исключения. - person HippieGeek; 06.10.2015