我想刪除存儲在USB閃存盤(實際上是一個Android設備的SD卡)中的文件。刪除FolderItem
我要求用戶指出應用程序的文件夾內的SD卡,並且我持有指向它的Shell32.Folder
對象。
我可以在文件之間進行迭代(FolderItem
對象),但是如何使用Shell32
類刪除文件?
通常File.Delete(filePath)
不起作用,因爲FolderItem.Path
是一個BSTR數據類型,所以也許關鍵是從一種類型轉換爲另一種類型,但我找不到一種方法來做到這一點。
任何想法?
EDIT 1:
FolderItem.Path
數據:
「:: {20D04FE0-3AEA-1069-A2D8-08002B30309D} \\\ \ USB#vid_04e8 & pid_6860 & ms_comp_mtp & GT-P5100 #7 & 392be4e4 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;
}
}
正如在EDIT 1所提到的,我要刪除的文件的file.Path
,格式如下:
「:: {20D04FE0-3AEA-1069-A2D8-08002B30309D} \\\?\ USB#vid_04e8 & pid_6860 & ms_comp_mtp & GT-P5100#7 & 392be4e4 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}」
EDIT 3:
如這裏建議的,我試圖使用P- /調用刪除文件,但沒有成功。
[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,且文件不會被刪除。我在事件查看器中查看發生了什麼的線索,但什麼都沒發現。
這不是它工作的方式。當您添加對shell32.dll的引用時,則使用內置於CLR中的COM互操作。它會自動在BSTR和System.String之間來回轉換 –
感謝@HansPassant,我明白了。所以,FolderItem.Path已經是一個託管字符串,但其內容不是File.Delete的工作形式。在這種情況下,我該如何轉換此路徑?甚至用shell刪除文件? – MarcVit
'ToString()'怎麼樣?似乎你應該從中得到一個'String'。 – Hogan