Чтение файла в приложении UWP
Решил я сделать красиво и с нуля писать приложение на Universal Windows Platform (UWP) по всем канонам. Однако, в Microsoft каноны пока еще не такие строгие как у РПЦ, поэтому даже из официальной справки половина кода не работает. А это еще чатжпт не подключили.... о каких ревизиях вообще может идти речь. Ладно, я отвлекся.
Нужно открыть файл хотябы для чтения. В справке предлагается добавить следующий код в Package.appxmanifest
<?xml version="1.0" encoding="utf-8"?>
<Package
...
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="... rescap">
...
<Capabilities>
<rescap:Capability Name="broadFileSystemAccess"/>
</Capabilities>
</Package>
Но он не работает, даже не распознается как безошибочный.
Long story short, чтобы не томить. Вот готовый апплет:
var picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
picker.SuggestedStartLocation =
Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
picker.FileTypeFilter.Add(".txt");
Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
if (file != null) {
// Приложение теперь вроде как должно иметь доступ
// к файлу... но смотрите catch блок
Log("Выбранный файл: " + file.Name);
} else {
Log("Операция выбора файла оменена");
return;
}
try {
var storageFile = await StorageFile.GetFileFromPathAsync(file.Path);
using (StreamReader reader = new StreamReader(bs)) {
string line;
while ((line = reader.ReadLine()) != null) {
Log("Строка прочитана: " + line);
}
}
}
}
catch (UnauthorizedAccessException) {
// Чертов UWP не заводится пока ему не дашь
// полный доступ к файловой системе.
// Да так быть не должно, но имеем то что имеем
await Windows.System.Launcher.LaunchUriAsync(
new Uri("ms-settings:privacy-broadfilesystemaccess"));
}
UPDATE Оказалось, что проекты из песочницы (те которые не загружены из МС стора, а например собраны локально) вообще не могут получать доступ к файлам за пределами папки в которую контент нужно еще загрузить программным путем — VS во время сборки делает это криво. И если какой-то доступ приложение получило, то это скорее баг чем победа. О боже, королеву ты не сохранил, сохрани хотя бы меня!