如何将文件放入回收站而不是删除?

29

编程解决方案的课程...


1
可能是 发送文件到回收站 的重复问题。 - MicroVirus
3个回答

38

8
+1 是因为您不拘泥于常规,引用了一个不受喜爱的命名空间,而不是采用丑陋的非托管代码。 - BenAlabaster
4
这些FileIO类和方法与Visual Basic有什么关系?把它们放在Microsoft.VisualBasic里对我来说完全没有意义。我一定是漏了什么东西。 - I. J. Kennedy
1
如果我猜的话,可能是Visual Basic团队实现了这个功能,而.NET团队决定将功能保留在原地,而不是对其进行修改。 - TK.
4
有没有不使用 "Microsoft.VisualBasic" 的解决方案? - Kiquenet
是的,我正在寻找一种不需要使用Visual Basic DLL的方法。 - puretppc
显示剩余2条评论

18

你需要深入了解非托管代码。这里是我一直在使用的静态类:

public static class Recycle
{
    private const int FO_DELETE = 3;
    private const int FOF_ALLOWUNDO = 0x40;
    private const int FOF_NOCONFIRMATION = 0x0010;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        [MarshalAs(UnmanagedType.U4)]
        public int wFunc;
        public string pFrom;
        public string pTo;
        public short fFlags;
        [MarshalAs(UnmanagedType.Bool)]
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        public string lpszProgressTitle;
    }

    [DllImport("shell32.dll", CharSet = CharSet.Auto)]
    static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp);

    public static void DeleteFileOperation(string filePath)
    {
        SHFILEOPSTRUCT fileop = new SHFILEOPSTRUCT();
        fileop.wFunc = FO_DELETE;
        fileop.pFrom = filePath + '\0' + '\0';
        fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;

        SHFileOperation(ref fileop);
    }
}

附加说明:

  • Jeff 在 C# 代码中使用了“Microsoft.VisualBasic”, 真是不好。
  • MS 在 VisualBasic 命名空间中放置了所有好东西,也是不好。

12
我猜这是VB比C#更好的领域之一...此外,它并不是因为在VB命名空间中所以它不是"C#" - 一个对象就是一个对象,不使用它仅仅因为它在你不喜欢的命名空间中有点荒谬,不是吗? - BenAlabaster
10
如果命名空间是 Microsoft.UsefulUtilities,那么你就不会对使用它们有任何疑虑,那么有什么区别呢? - BenAlabaster
3
当然,重点不在于命名空间,而是你需要链接VB库才能使用该命名空间。这应该很明显。 - Mike Lischke

13

我发现最好的方法是使用VB函数FileSystem.DeleteFile

Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(file.FullName,
    Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs,
    Microsoft.VisualBasic.FileIO.RecycleOption.SendToRecycleBin);

需要将Microsoft.VisualBasic添加为引用,但它是.NET框架的一部分,因此不是额外的依赖项。

其他解决方案需要使用P/Invoke调用SHFileOperation,同时定义所有各种结构和常量。相比之下,包含Microsoft.VisualBasic要更加简洁。


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