【问题标题】:How to check if file exist after saved it?保存后如何检查文件是否存在?
【发布时间】: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 类的人提供了非常有用的信息。谢谢

标签: c# uwp


【解决方案1】:

但我想确保在“WriteBytesAsync”方法之后文件已经存在。

根据您的要求,您可以使用GetFileFromPathAsync 方法获取文件,如果文件不为空,则表示该文件存在。请注意,如果您想使用上述方法,您需要添加broadFileSystemAccess 能力,并在您的系统设置中打开它。更多信息请参考this

Windows.Storage.CachedFileManager.DeferUpdates(file);
await Windows.Storage.FileIO.WriteBytesAsync(file, new byte[3]);
var temp = await StorageFile.GetFileFromPathAsync(file.Path);
if(temp != null)
{

}
else
{

}

“WriteBytesAsync”方法是否足以确保文件已保存??

是的,WriteBytesAsync 方法需要传递StorageFile 参数。如果文件参数不为空,则表示它已在文件夹中创建。否则会抛出空异常。

【讨论】:

  • 感谢您的回答,使用“GetFileFromPathAsync”可以工作,但是,使用“GetFolderFromPathAsync(savePath)”的情况相同,因为我没有访问权限,正如你所说,我' d 需要添加“broadFileSystemAccess”,我不希望我的应用提交因为错误的理由而被拒绝哈哈。
  • 是的,我认为你的第二个问题已经指出了关键。当PickSaveFileAsync完成且返回值不为null时,文件已在存储中创建。
猜你喜欢
  • 2011-09-17
  • 2012-09-19
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多