filesavepickerを使用してファイルに書き込みます
-
28-10-2019 - |
質問
このエラーの原因が何であるかを理解するのが少し困難です。私は追加しました FilePicker
マニフェストの能力であり、それは私がクレイジーなことをしようとしているわけではありません。ドキュメントフォルダー内のサブフォルダーに保存しようとするだけです...
エラー:「タイプ「System.UnauthorizedAccesSexception」の未解決の例外」がmscorlib.dllで発生しました
追加情報:アクセスは拒否されます。 (hresultからの例外:0x80070005(e_accessdenied)) "
ユーザーアカウントが管理者であり、フォルダーとファイルを完全に制御できることを確認しました。しかし、私は他に何を試すことができるかわかりません。
public void NewBTN_Click(object sender, RoutedEventArgs e)
{
var mbox = new MessageDialog("Would you like to save changes before creating a new Note?", "Note+ Confirmation");
UICommand YesBTN = new UICommand("Yes", new UICommandInvokedHandler(OnYesBTN));
UICommand NoBTN = new UICommand("No", new UICommandInvokedHandler(OnNoBTN));
mbox.Commands.Add(YesBTN);
mbox.Commands.Add(NoBTN);
mbox.DefaultCommandIndex = 1;
mbox.ShowAsync().Start();
}
async void OnYesBTN(object command)
{
this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
{
// User clicked yes. Show File picker.
HasPickedFile = true;
}, this, null);
if (HasPickedFile)
{
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
// Dropdown of file types the user can save the file as
savePicker.FileTypeChoices.Add("Cascading Stylesheet", new List<string>() { ".css" });
savePicker.FileTypeChoices.Add("Hypertext Markup Language", new List<string>() { ".html" });
savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
// Default extension if the user does not select a choice explicitly from the dropdown
savePicker.DefaultFileExtension = ".txt";
// Default file name if the user does not type one in or select a file to replace
savePicker.SuggestedFileName = "New Note";
StorageFile savedItem = await savePicker.PickSaveFileAsync();
if (null != savedItem)
{
// Application now has read/write access to the saved file
StorageFolder sFolder = await StorageFolder.GetFolderFromPathAsync(savedItem.Path);
try
{
StorageFile sFile = await sFolder.GetFileAsync(savedItem.FileName);
IRandomAccessStream writeStream = await sFile.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream oStream = writeStream.GetOutputStreamAt(0);
DataWriter dWriter = new DataWriter(oStream);
dWriter.WriteString(Note.Text);
await dWriter.StoreAsync();
oStream.FlushAsync().Start();
// Should've successfully written to the file that Windows FileSavePicker had created.
}
catch
{
var mbox = new MessageDialog("This file does not exist.", "Note+ Confirmation");
UICommand OkBTN = new UICommand("Ok", new UICommandInvokedHandler(OnOkBTN));
mbox.Commands.Add(OkBTN);
mbox.DefaultCommandIndex = 1;
mbox.ShowAsync().Start();
}
}
}
}
public void OnOkBTN(object command)
{
this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
{
// Do something here.
}, this, null);
}
public void OnNoBTN(object command)
{
this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
{
// Don't save changes. Just create a new blank Note.
Note.Text = String.Empty;
}, this, null);
}
filesavepickerによって作成されたファイルに書き込むにはどうすればよいですか?
解決
電話する必要はありません StorageFolder.GetFolderFromPathAsync(savedItem.Path)
と sFolder.GetFileAsync(savedItem.FileName)
. 。例外をスローするため、これら2つの行を削除する必要があります。メソッドによって返されたストレージファイルオブジェクトを使用する必要があります savePicker.PickSaveFileAsync()
, 、そのオブジェクトにはすべての権限があるためです。次に、単純に電話することができます savedItem.OpenAsync(FileAccessMode.ReadWrite)
.
他のヒント
おそらく、アプリのappxManifestの機能部分に有効になっている「ドキュメントライブラリアクセス」がないでしょう。この機能がなければ、Windowsはファイルシステムへのアクセスを制限します。音楽、ビデオ、画像ライブラリにも同様の機能があります。
すでに「ファイルピッカー」を宣言部分に追加していますが、これはおそらくあなたが望むものではありません。 「ファイルピッカー」宣言は、他のアプリケーションがファイルピッカーを呼び出す場合、アプリがファイルの可能なソースとしてリストされることを示しています。
また、マニフェストにビデオライブラリアクセス機能を追加すると、Windows 10を再起動した後にのみ有効になることがわかりました。たぶん、コンピューターの問題だと思いますが、共有する価値があると思います。