删除Maui应用平台Android上的文件



我有一个maui应用程序,它可以读取SD卡上的数据日志(在Android中,SD卡位于连接的USB读取器中-文件管理器和maui文件选择器很高兴地看到USB外部驱动器并读取和打开文件(从写入SQL的文件(csv(中提取信息,然后将文件备份到云中现在重要的是从SD卡中删除数据记录-

这个问题似乎只出现在Android上,即使如此,它也会像预期的那样在模拟器上执行删除。在Android上>10(我的目标是11 sdk 31(在真实的手机上,它说它已经删除了该文件(file.exists返回false(,但该文件仍然存在于sd卡上

我知道Android收紧了权限,我在清单文件中有请求权限,我也有代码,请求用户确认权限,但仍然无法删除,如Microsoft Docs 中所述

我知道但不太理解安卓系统复制打开的文件的机制,但这似乎并不相关,因为我已经打开并阅读了文件。我也不确定这是否与我试图删除外部USB-SD存储上的文件有关——如果我将数据日志移动到内部存储(如下载(,问题仍然存在。

安卓权限:(你可以看到我向它扔了厨房水槽;-(

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_USB" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

关键代码如下所示(在这种情况下,如果数据日志包含的线路少于300条,则它不包含有用的数据,因此将被删除-但一旦数据日志被完全处理并被处理,原理是相同的注意:这是在MAUI上使用VS 2022 17.3预览6fwiw的xamarin安卓sdk是v 13文件删除在windows上有效-我还没有尝试过IOS,因为我在windows 上很难让我的MAC与VS同步

总之,c#代码正在做它在微软文档中所说的删除和报告文件不存在,但实际上并没有这么做!!这是我无法理解的

有人有什么想法吗

var ff1 = System.IO.File.ReadAllLines(csvorig);
var csvlen= ff1.Length;
if (csvlen < 300)   // one line per second means 5 mins ignore
{
var nl = System.Environment.NewLine;
var answ = await DisplayAlert(dbpath + nl + "Small file", "the file you've 
selected contains no flight" + nl + "prob cause = switching on avionics for < 
5min " + nl + " file should be deleted", "DELETE", "ignore");
if (answ)
{
status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
if (status == PermissionStatus.Denied)
{
PermissionStatus status2=awaitPermissions.RequestAsync<Permissions.StorageWrite>();
}
/// check permissions AGAIN !! in case problem there
status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>();
if (status == PermissionStatus.Denied)
{
await DisplayAlert("warn", "Sorry cannot grant permission n you will need to delete this file using filemanager n" + csvorig, "cancel");
return;
}
try
{
// ensure that file attribs are normal // saw this in one post on file 
//deleting but not ref maui
File.SetAttributes(csvorig, FileAttributes.Normal);
File.Delete(csvorig);
}
catch (Exception ee)
{
// code never throws exception
var m = ee.Message;
await DisplayAlert("", m, "Cancel");
}

if (File.Exists(csvorig))
{           
await DisplayAlert("warn", "failed to delete", "cancel");
}
else
{ // file is ALWAYS reported as 'not existing' but is still there next 
//time use filepicker
await DisplayAlert(csvorig, "has been deleted", "back"); }
}
}





我做了一个样本来测试,如果应用程序只有读写存储的权限,它就不能删除SD卡或存储中的文件。它只需删除应用程序自己的私人文件夹中的文件即可。

因此,它需要用户授予应用程序管理存储的权限。您可以尝试将以下代码放入主活动中。

protected override void OnCreate(Bundle savedInstanceState)
{
if (!Android.OS.Environment.IsExternalStorageManager)
{
Intent intent = new Intent();
intent.SetAction(Android.Provider.Settings.ActionManageAppAllFilesAccessPermission);
Android.Net.Uri uri = Android.Net.Uri.FromParts("package", this.PackageName, null);
intent.SetData(uri);
StartActivity(intent);
}
base.OnCreate(savedInstanceState);
}

多亏了张丽云,我解决了一些问题我正在尝试删除"cahced"文件,因此名称派生自文件选择器该文件名报告为"storage/emulated/0/Android/data/companyname.flymaui6/cache/xxxxxxxxxx/log_2206260834_EGJB.csv">

但实际上我想要的是SD卡上的文件名。文件管理器给了我一个线索——在usb sd卡读卡器上的日志文件的属性中,它说路径是"mnt/media_rw/547e-78ae/data_log/log220715_0834XXX.csv"

private async void chkSD()
{
try
{
var xxx = System.Environment.GetLogicalDrives();
var messtmp = "";
foreach (string foldnm in xxx)
{
if (foldnm.IndexOf("/mnt/media_rw", StringComparison.OrdinalIgnoreCase) >= 0)
{
messtmp = foldnm;
break;
}
else
{
messtmp = "..";
}
}
sdcardpath = messtmp + "/data_log/";
if (messtmp.Contains(".."))
{
await DisplayAlert("", "could not find SD card n Only temporary cached files will be deleted", "cancel");
}
} catch
{ 
}
}

现在我只添加";sdcardpath";删除之前的文件名

这应该是通用的,因为不太可能在Android机器上获得2个SD卡读取器,并且这种方法会获取唯一的SD标识符

我还不知道路径的meadia_rw位是否是unuversal,但到目前为止,它确实删除了SD卡上的文件

如果我已经将日志文件从sd卡复制到Androi机器上的dolder,那么当文件处于say\download
时,要找到文件的真实路径仍在进行中。但我可以接受这一点,拥有一个干净的sd卡并避免用户乱用文件管理器是很重要的。

所有其他的东西都是真的——一个人需要权限,但事实证明这是为了找到真正的路径(嗯,听起来我们需要一个哈利路亚(。安卓创建的缓存文件无论如何都会被删除

如果我能以某种方式从FilePicker 获得"真实"路径,那会简单得多

感谢的所有帮助

最新更新