如何在控制台应用程序中将文件移动到回收站?

5

我已经能够通过以下代码永久删除文件:

var DeleteFromDir = new DirectoryInfo(sFromPath);
var files = DeleteFromDir.GetFiles(".txt");
foreach(var file in files)
{
    if(bDeletePermanently)
        file.Delete();
    else
        ; //Move to recycle bin
}

我尝试了以下操作:

添加对 Microsoft.VisualBasic 程序集的引用。需要使用此库中的类。

  • 将以下 using 语句添加到文件顶部:using Microsoft.VisualBasic.FileIO;

  • 使用 FileSystem.DeleteFile 删除文件,可以选择是否放入回收站。

但是,这种方法仅适用于 UI 上下文,而我的应用程序基于控制台。


1
你可以在你的Main()方法上放置[STAThread]属性。这是对公寓状态规则的相当严重的违反,但你会逃脱惩罚,因为很多VB.NET程序都这样做。如果你的程序出现死锁,那么你就没有逃脱惩罚了。 - Hans Passant
@HansPassant,我以为它只用于线程..不知道我们也可以在控制台中使用..如果有帮助解决我面临的问题,你能否写一些示例代码? - Enthusiastic
它对线程确实很重要。如果您创建任何线程并且它们使用单元线程的COM服务器,那么您将会遇到死锁问题。这种情况的概率相当低。您正在使用的方法依次使用SHFileOperation()。这是一个WinAPI函数,因为它可能显示用户界面,所以需要STA。当您删除到回收站时,它不会显示任何内容,因此无需担心。我不知道如何将9个字符[STAThread]转换为示例代码。只需使用它即可。 - Hans Passant
1个回答

0
如果您有对Microsoft.VisualBasic程序集的引用(如果您喜欢,也可以使用NuGet包),那么您应该能够使用下面的代码。
var DeleteFromDir = new DirectoryInfo(sFromPath);
var files = DeleteFromDir.GetFiles("*.txt");
foreach (var file in files)
{
    if (bDeletePermanently)
    {
        file.Delete();
    }
    else
    {
        FileSystem.DeleteFile(file.FullName, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin);
    }
}

针对您关于UI上下文的担忧,该函数仅会“显示错误对话框并隐藏进度对话框”。如果您想了解更多信息,可以在Microsoft的文档中查找。

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