Как проверить, существует ли файл в приложении 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; если файл не существует, вы должны помнить, что впоследствии удаляли созданный файл.
В целом - вам лучше придерживаться метода обработки исключений.
Ответ 8
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/
Ответ 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 официально предназначен для этой цели.