【发布时间】:2021-03-10 01:58:45
【问题描述】:
我正在使用 UWP 应用程序,在某些时候,用户现在有机会保存图像(完成)我只让用户知道保存操作是由“messageDialog”完成的,这是我的代码:
var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
savePicker.FileTypeChoices.Add("QR Code", new List<string>() { ".png", ".jpg", ".jpeg", ".jpe", ".bmp" });
savePicker.SuggestedFileName = "QR_01";
Windows.Storage.StorageFile file = await savePicker.PickSaveFileAsync();
if (file != null)
{
Windows.Storage.CachedFileManager.DeferUpdates(file);
await Windows.Storage.FileIO.WriteBytesAsync(file, _bytes3);
Windows.Storage.Provider.FileUpdateStatus status = await Windows.Storage.CachedFileManager.CompleteUpdatesAsync(file);
if (status == Windows.Storage.Provider.FileUpdateStatus.Complete)
{
var messageDialog = new Windows.UI.Popups.MessageDialog("File saved on: " + file.Path);
await messageDialog.ShowAsync();
}
else
{
//this.textBlock.Text = "File " + file.Name + " couldn't be saved."; not defined by now
}
done = true;
}
else
{
this.textBlock.Text = "operation canceled";
done = false;
}
到目前为止,这很好用,但我想确保在“WriteBytesAsync”方法之后文件已经存在。所以,事情就是这样,用户可以将图像保存在他们有权访问的任何目录中,因此我无法检查(或读取)他们选择的文件夹,因为我在保存文件后没有访问权限。我尝试过这样的方法来获取文件夹访问权限:
string savePath = System.IO.Path.GetDirectoryName(file.Path);
Windows.Storage.StorageFolder saveFolder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(savePath);
为了使用“GetFileAsync”来检查文件或“FutureAccessList”以供将来访问,但由于我对任何目录都有文件访问权限,因此它失败了,因此我无法使用任何解决方案在这里:UWP Check If File Exists
我的问题是:
1.- 用户点击“保存”按钮后,有没有办法检查文件是否保存或写入成功?
2.- “WriteBytesAsync”方法是否足以确保文件已保存?根据FileIO.WriteBytesAsync(IStorageFile, Byte[]) Method 的信息,它不会抛出任何异常。
【问题讨论】:
-
WriteBytesAsync 如果有问题会抛出。看到您拥有实际文件,您可以在写入后将其读回以检查它是否存在,或者向 Windows 询问它的 fileSize 并检查它不是 0 字节。但是 WriteBytesAsync 完成应该足够了,因为写入已被处理并且文件流在返回之前被刷新。见docs.microsoft.com/en-us/windows/uwp/files/…
-
@JohnnyWestlake 为任何处理 FileIO 和 PathIO 类的人提供了非常有用的信息。谢谢