【问题标题】:How can I opt the user to delete all files in a folder (but no subdirectories)?如何选择用户删除文件夹中的所有文件(但不删除子目录)?
【发布时间】:2010-02-19 10:28:43
【问题描述】:

我有一个文件夹路径。该文件夹包含许多文件以及一些子文件夹。我想让用户使用标准 Windows 对话框删除文件(但不是文件夹)。

我目前正在使用此代码,它会删除整个文件夹。

Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory (
    path,
    UIOption.AllDialogs,
    RecycleOption.SendToRecycleBin,
    UICancelOption.DoNothing);

我知道我可以枚举所有文件并提示用户输入每个文件,但这根本不实用。

【问题讨论】:

    标签: c# .net windows file-io


    【解决方案1】:

    为什么不为这个特定任务编写一个函数呢?

    public static void DeleteFilesInFolder()
            {
                using(var dlg = new FolderBrowserDialog())
                {
                    if(dlg.ShowDialog() == DialogResult.OK)
                    {
                        var folderPath = dlg.SelectedPath;
                        var dir = new DirectoryInfo(folderPath);
                        var files =dir.GetFiles();
                        foreach (var f in files)
                    {
                        try
                        {
                            f.Delete();
                        }
                        catch (Exception ex) {
                            //handle this error
                        }
                    }
                    }
                }
            }
    

    嗯,好的,只是一个建议..

    然后看看这个:

    http://www.blackwasp.co.uk/RecycleBin2.aspx

    [StructLayout(LayoutKind.Sequential)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        public uint wFunc;
        public string pFrom;
        public string pTo;
        public ushort fFlags;
        public int fAnyOperationsAborted;
        public IntPtr hNameMappings;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpszProgressTitle; 
    }
    
    private const int FO_DELETE = 0x0003;
    private const int FOF_SILENT = 0x0004;
    private const int FOF_ALLOWUNDO = 0x0040;
    private const int FOF_NOCONFIRMATION = 0x0010;
    private const int FOF_WANTNUKEWARNING = 0x4000;
    
    [DllImport("Shell32.dll")]
    static extern int SHFileOperation([In] ref SHFILEOPSTRUCT lpFileOp);
    

    这样用于删除文件夹中与*.* 模式匹配的所有文件:

    SHFILEOPSTRUCT operation = new SHFILEOPSTRUCT();
    operation.wFunc = FO_DELETE;
    operation.pFrom = @"c:\Recycle\*.*" + "\0\0";
    operation.fFlags = FOF_ALLOWUNDO;
    int result = SHFileOperation(ref operation);
    

    【讨论】:

    • 路径我已经知道了,不需要用户再选择。 File.Delete() 不会删除到回收站。另外,我想提示用户接受“删除 497 文件?”通过使用标准窗口对话框。
    • 只需添加第二个 YesNo 对话框,其中包含“您确定要删除”+ dir.GetFiles().Count +“吗?”选择目录后的消息。
    • Carra:我真的更喜欢使用内置功能。
    • 它还不是我想要的,但它是一个非常好的起点。谢谢!可悲的是,我不会让我赞成你的答案:(
    【解决方案2】:

    Visual Basic 使用SHFileOperation() API 函数来显示对话框。我认为您可以自己调用它并通过为 SHFILEOPSTRUCT.fFlags 成员指定 FOF_FILESONLY 标志来自定义它。 P/Invoke 是坚韧不拔的,请访问 pinvoke.net 以获取声明。

    【讨论】:

    • 这里有一个 SHFileOperation 来复制文件stackoverflow.com/questions/8722907/… 你可以将 FILEOP_FLAGS_ENUM 标志更改为类似 FOF_WANTNUKEWARNING 和 FOF_NORECURSION 或 FOF_FILESONLY 的标志。只要您不使用 FOF_NOERRORUI,您应该会看到确认对话框
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多