我想删除存储在 USB 闪存驱动器(实际上是 android 设备的 sd 卡)中的文件。
我要求用户将应用程序的文件夹指向 sd 卡内,然后我持有一个Shell32.Folder
指向它的对象。
我可以在文件(对象)之间进行迭代FolderItem
,但是如何使用Shell32
类删除文件?
通常File.Delete(filePath)
不起作用,因为它FolderItem.Path
是 BSTR 数据类型,所以也许关键是从一种类型转换为另一种类型,但我找不到这样做的方法。
有任何想法吗?
编辑1:
FolderItem.Path
数据:
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp>-p5100#7&392be4e4&0&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{10001,SECZ9519043CHOHB,12530364416}\{ 015C008D-013D-0145-D300-D300CB009500}\{015C00EE-013D-0145-0201-37012C010901}\{025901D2-029D-020F-DE01-FE010D02A601}"
这不是File.Delete
. 关于如何转换的任何想法?
编辑2:
打开浏览文件夹窗口的方法,用户可以在他的android设备的SD卡中指出应用程序目录,这样我就可以迭代文件夹和文件,并与服务器同步一些数据。由于Win8和Shell32之间的问题,这样做:
public Shell32.Folder GetShell32NameSpace(Object folder)
{
Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
Object shell = Activator.CreateInstance(shellAppType);
return (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
}
使用上述方法,获取文件夹:
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
Folder androidPath = BrowseForFolder(windowHandle.ToInt32(), "App's data folder", 0, 0);
我创建一个文件并将其复制到应用程序的“数据”文件夹中,以便设备可以识别同步操作、告诉用户并关闭应用程序:
byte[] data = new UTF8Encoding(true).GetBytes("sync_cable");
if (androidPath != null)
{
foreach (FolderItem dir in androidPath.Items())
{
if (dir.IsFolder && dir.Name == "data")
{
Folder dataFolder = GetShell32NameSpace(dir.Path);
if (dataFolder != null)
{
string tempPath = Path.GetTempPath();
string path = Path.Combine(tempPath, flagFileName);
File.WriteAllBytes(path, data);
Folder localPath = GetShell32NameSpace(tempPath);
if (localPath != null)
{
foreach (FolderItem file in localPath.Items())
{
if (file.Name.Contains(flagFileName))
{
dataFolder.CopyHere(file);
break;
}
}
}
}
break;
}
}
}
同步后,我想删除文件,以便应用程序可以正常运行:
foreach (FolderItem file in dataFolder.Items())
{
if (file.Name.Contains(flagFileName))
{
// THIS THROWS AN 'INVALID PATH' EXCEPTION
// FileInfo fi = new FileInfo(file.Path);
// fi.Delete();
// THIS ALSO THROWS AN 'INVALID PATH' EXCEPTION
// File.Delete(file.Path);
break;
}
}
如编辑 1file.Path
中所述,我要删除的文件具有以下格式:
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp>-p5100#7&392be4e4&0&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{10001,SECZ9519043CHOHB,12530364416}\{ 015C008D-013D-0145-D300-D300CB009500}\{015C00EE-013D-0145-0201-37012C010901}\{025901D2-029D-020F-DE01-FE010D02A601}"
编辑 3:
正如这里所建议的,我尝试使用 P/Invoke 删除文件,但没有成功。
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool DeleteFile(string lpFileName);
调用方法:
foreach (FolderItem file in dataFolder.Items())
{
if (file.Name.Contains(flagFileName))
{
// ...
bool deleted = DeleteFile(file.Path);
// ...
}
}
该方法返回false,文件没有被删除。我在事件查看器中寻找关于发生了什么的线索,但什么也没找到。