使用C#列出回收站中的文件名,不使用任何外部文件。

5
我希望能有一个函数,用C#代码检索回收站(在win 7上)中的文件名。该框架似乎没有包含这个功能。
使用"Directory.GetFiles()"是行不通的,对吗?
我找到了一段使用"windows shell32 automation"的代码,但这需要提供interop.shell32.dll文件,并与我的应用程序一起重新分发。由于我的应用程序应该是独立的(只要用户计算机上存在Net Framework 2),所以这个解决方案并不理想。
对我来说,这个解决方案似乎也不可靠,因为它使用COM Automation,一些引用可能会失败,或者调用Namespace(10)可能会失败。我甚至不确定Namespace(10)是否总是回收站的正确文件夹。
这段代码是我在这个问题上为C#找到的全部内容。
我在code project上找到了一个Delphi和另一个实现,但如果我将那段代码复制到我的C#项目中,它实际上全部都是红色下划线,编译不了。我不确定如何更正这段代码,使其在C#中工作。在pinvoke.net上,我找不到我需要使用的Windows函数的代码(SHQueryRecycleBin),但也许我必须使用更多的函数才能从回收站获取文件列表。
有人看到过类似的代码或有任何想法吗?

2
如果你复制了一些 Delphi 代码,那很可能无法通过 C# 编译... - feralin
1
没错,C++代码无法使用C#编译器进行编译。你只能使用C#编译器来编译C#代码;这也是它被称为“C#编译器”的原因... - feralin
1
@feedwall 很多语言都兼容Visual Studio,但这并不意味着每种与Visual Studio兼容的语言都会使用C#编译器。正如feralin所说,只有使用C#编译器才能编译C#。 - madbrendon
1个回答

7
如果在你的应用程序中添加了一个引用C:\Windows\System32\Shell32.dll,你就可以轻松访问回收站文件的文件名。
例如:
    using Shell32;

    public IEnumerable<string> GetRecycleBinFilenames()
    {
        Shell shell = new Shell();
        Folder recycleBin = shell.NameSpace(10);

        foreach (FolderItem2 recfile in recycleBin.Items())
        {
            // Filename
            yield return recfile.Name;

            // full recyclepath
            // yield return recfile.Path;
        }

        Marshal.FinalReleaseComObject(shell);
    }

如果额外创建的文件让您感到困扰,您可以将其嵌入可执行文件中。

1
如果您不想要额外的文件,请将Shell32的属性设置为嵌入互操作类型,这将适用于任何Win7机器。 - sa_ddam213
1
添加了设置图片,它应该向后兼容旧版本的Windows,但我现在无法测试。 - sa_ddam213
如果您想使用枚举来提高可读性,可以使用:shell.NameSpace(ShellSpecialFolderConstants.ssfBITBUCKET) - allen1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接