我正在开发一个 .NET MAUI 应用程序,我需要将日志存储在用户可访问的位置,类似于 iOS 和 Android 上的 Documents 文件夹。是否可以实现这一目标,如果可以,我如何以编程方式访问此路径?
我感谢有关这些要求的任何见解或建议。
没有跨平台 API 可以做到这一点。需要调用平台原生代码。
1。对于安卓:
调用以下代码获取Download文件夹(使用download文件夹,因为android 10及以下版本没有Documents文件夹),创建文件并写入。
#if ANDROID
var path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
using (FileStream fileStream = new FileStream(Path.Combine(path, "test.log"), FileMode.Create))
{
var data = Encoding.UTF8.GetBytes("this is log file");
await fileStream.WriteAsync(data, 0, data.Length);
}
#endif
另外,上述代码在android 11及以上版本上无需任何权限即可直接运行。对于android 10及以下版本,您需要请求存储权限。
在AndroidManifest.xml中添加权限和
android:requestLegacyExternalStorage="true"
(仅适用于android 10):
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true" android:requestLegacyExternalStorage="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>
</manifest>
运行时请求权限:
if (Android.OS.Build.VERSION < Android.OS.BuildVersionCodes.R)
{
var status = Permissions.RequestAsync<Permissions.StorageWrite>();
}
2。适用于 iOS
iOS 上没有公共文档文件夹。每个应用程序都有自己的 Documents 文件夹。您可以使用以下代码创建文件并写入:
var path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
using (FileStream fileStream = new FileStream(Path.Combine(path, "test.log"), FileMode.Create))
{
var data = Encoding.UTF8.GetBytes("this is log file");
await fileStream.WriteAsync(data, 0, data.Length);
}
此外,如果您希望其他用户可以访问该文件,请将以下密钥添加到Info.plist中:
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>
最后请在实体设备上测试一下,这个在模拟器上是不行的。