将文件移动到回收站并清空回收站是有据可查的,但是如何以编程方式从回收站中恢复文件呢?
问问题
3141 次
3 回答
4
纯 C# 似乎没有解决方案。您很可能不得不求助于 P/Invoke。 本文介绍了使用SHFileOperation API的 C++ 解决方案。
于 2009-05-26T16:01:17.240 回答
1
除了前面提到的codeproject链接之外,我可以看到的唯一其他引用提到了这一点:
通过 CSIDL_BITBUCKET 调用 SHGetFolderLocation。然后,您可以照常操作该文件夹。您必须为 SHGetFolderLocation 函数创建一个互操作。
“CSIDL_BUCKET”是虚拟 RecycleBin 文件夹的常量。引用取自此处,将涉及与 Windows shell 的互操作。MSDN还提到此功能已被弃用,取而代之的是 Vista 中的另一个功能。
于 2009-05-26T16:10:37.503 回答
0
希望下面的代码可以恢复文件。请确保,STA 调用仅支持 shell 调用
using System;
using System.Collections;
using System.Windows.Forms;
using System.IO;
using Shell32; //Reference Microsoft Shell Controls And Automation on the COM tab.
using System.Runtime.InteropServices;
using Microsoft.VisualBasic.FileIO;
using System.Threading;
private static void Restore(object param)
{
object[] args = (object[])param;
string filename = (string)args[0];
string filepath = (string)args[1];
Shl = new Shell();
Folder Recycler = Shl.NameSpace(10);
var c = Recycler.Items().Count;
var _recycler = Recycler.Items();
for (int i = 0; i < _recycler.Count; i++)
{
FolderItem FI = _recycler.Item(i);
string FileName = Recycler.GetDetailsOf(FI, 0);
if (Path.GetExtension(FileName) == "") FileName += Path.GetExtension(FI.Path);
//Necessary for systems with hidden file extensions.
string FilePath = Recycler.GetDetailsOf(FI, 1);
if (filepath == Path.Combine(FilePath, FileName))
{
DoVerb(FI, "ESTORE");
break;
}
}
}
private static bool DoVerb(FolderItem Item, string Verb)
{
foreach (FolderItemVerb FIVerb in Item.Verbs())
{
if (FIVerb.Name.ToUpper().Contains(Verb.ToUpper()))
{
FIVerb.DoIt();
return true;
}
}
return false;
}
于 2020-06-10T09:08:23.270 回答