提问人:Nick Sabbe 提问时间:11/15/2023 最后编辑:Nick Sabbe 更新时间:11/16/2023 访问量:46
从 Xamarin 在内部存储上写入文件时权限被拒绝
Permission Denied when writing file on internal storage from Xamarin
问:
我正在尝试执行以下操作:
var photo = await MediaPicker.CapturePhotoAsync();
string maindir = Path.Combine(Xamarin.Essentials.FileSystem.AppDataDirectory, "Pictures");
string filename = System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + System.IO.Path.GetExtension(photo.FileName);
var newFile = Path.Combine(maindir, filename);
Directory.CreateDirectory(newFile);
using (var stream = await photo.OpenReadAsync())
{
using (var newStream = File.OpenWrite(newFile))
{
await stream.CopyToAsync(newStream);
}
}
通过使用,我应该在内部存储中获取一个文件夹(顺便说一句,我还提供了外部存储写入权限,但这应该不相关 - 它没有解决问题)。代码的其余部分几乎逐字摘自 Xamarin.Essentials 文档。Xamarin.Essentials.FileSystem.AppDataDirectory
在 File.OpenWrite 的行中,我收到一个 ,说“访问路径 '/data/user/0/com.companyname.peerpeek/files/Pictures/20231115_154707.jpg' 被拒绝”。UnauthorizedAccessException
从我所读到的一切来看,这不应该发生。那么:这是一个错误还是我在这里遗漏了一些明显的东西?
为了更好地衡量:在模拟的 Pixel 5 (Android 13) 上运行它时以及在自己的手机 (Android 12) 上调试时,我都会遇到此错误。
[编辑]根据要求:这是完整的例外:
System.UnauthorizedAccessException: Access to the path '/data/user/0/com.companyname.peerpeek/files/Pictures/20231115_163542.jpg' is denied.
at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share, System.Int32 bufferSize, System.Boolean anonymous, System.IO.FileOptions options) [0x000e7] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.IO/FileStream.cs:196
at System.IO.FileStream..ctor (System.String path, System.IO.FileMode mode, System.IO.FileAccess access, System.IO.FileShare share) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.IO/FileStream.cs:91
at (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
at System.IO.File.OpenWrite (System.String path) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.IO.FileSystem/src/System/IO/File.cs:271
at PeerPeek.MainPage.LoadPhotoAsync (Xamarin.Essentials.FileResult photo) [0x00187] in C:\Users
icksa\source\repos\PeerPeek\PeerPeek\PeerPeek\MainPage.xaml.cs:88
答:
1赞
Guangyu Bai - MSFT
11/16/2023
#1
您可以在不使用 .它将存储在本地存储中。Directory.CreateDirectory(newFile);
var photo = await MediaPicker.CapturePhotoAsync();
string maindir = Path.Combine(Xamarin.Essentials.FileSystem.AppDataDirectory, "Pictures");
string filename = System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + System.IO.Path.GetExtension(photo.FileName);
var newFile = Path.Combine(maindir, filename);
using (var stream = await photo.OpenReadAsync())
using (var newStream = File.OpenWrite(newFile))
await stream.CopyToAsync(newStream);
评论
0赞
Nick Sabbe
11/16/2023
如果子文件夹“图片”不存在,会发生什么情况?OpenWrite 会即时创建它还是会失败(我猜是最后一个)?也许你可以根据@blackapps在问题的评论中建议的内容调整你的答案?
1赞
blackapps
11/16/2023
#2
Directory.CreateDirectory(新文件);
那应该是:
Directory.CreateDirectory(mainDir);
现在无法创建该文件,因为已经存在同名目录。
事实上,行动被拒绝了。
评论
Directory.CreateDirectory(newFile);
那应该是:Directory.CreateDirectory(mainDir);