gpt4 book ai didi

c# - 删除文件夹项

转载 作者:行者123 更新时间:2023-11-30 13:00:07 25 4
gpt4 key购买 nike

我想删除存储在 U 盘(实际上是 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;
}
}

如编辑 1 中所述,我要删除的文件的 file.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,文件没有被删除。我在事件查看器中查看了发生了什么的线索,但一无所获。

最佳答案

路径中看起来像“\?\”的部分告诉您这是一条很长的路径。遗憾的是,CLR 无法处理长路径(它仅限于 MAX_PATH = 260 废话)。我相信您可以使用 WinAPI 的 DeleteFile 来完成您想要的。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363915(v=vs.85).aspx

使用 PInvoke,一切就绪。

http://pinvoke.net/default.aspx/kernel32/DeleteFile.html?diff=y

关于c# - 删除文件夹项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com