重启时删除非空文件夹

 流连的瓶子 发布于 2023-02-03 10:55

Users从域中删除用户后,我试图删除文件夹中的用户配置文件文件夹.问题是有时系统可能正在使用该文件夹.

问题是使用MOVEFILE_DELAY_UNTIL_REBOOT具有MoveFileEx将只能删除空文件夹.

来自MSDN:

如果dwFlags指定MOVEFILE_DELAY_UNTIL_REBOOTlpNewFileNameNULL,则MoveFileEx 会在系统重新启动时注册要删除的lpExistingFileName文件.如果lpExistingFileName引用目录,则仅当目录为空时,系统才会在重新启动时删除目录.

删除包含正在使用的文件的非空文件夹的正确方法是什么?


这是一个基于Michel答案的简单测试程序,它按预期工作.

internal static class Program
{
    private static void Main(string[] args)
    {
        foreach (var file in Directory.EnumerateFiles(args[0], "*", SearchOption.AllDirectories))
        {
            Console.WriteLine(file);
        }

        foreach (var directory in Directory.EnumerateDirectories(args[0], "*", SearchOption.AllDirectories))
        {
            Console.WriteLine(directory);
            DeleteFileOnReboot(directory);
        }

        DeleteFileOnReboot(args[0]);
    }

    private static void DeleteFileOnReboot(string file)
    {
        bool result = MoveFileEx(file, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
        try
        {
            if (!result)
                throw new Win32Exception();
        }
        catch (Win32Exception ex)
        {
            Console.WriteLine(ex);
        }
    }

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);

}

[Flags]
enum MoveFileFlags
{
    MOVEFILE_REPLACE_EXISTING = 0x00000001,
    MOVEFILE_COPY_ALLOWED = 0x00000002,
    MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004,
    MOVEFILE_WRITE_THROUGH = 0x00000008,
    MOVEFILE_CREATE_HARDLINK = 0x00000010,
    MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x00000020
}

我通过两个循环执行此操作Directory.EnumerateFiles,Directory.EnumerateDirectories因为Directory.EnumerateFileSystemEntries将在文件夹中的文件之前列出文件夹,因此删除将失败.

1 个回答
  • 在我见过的大多数实现中,目录中的每个文件都被"删除" MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT,然后以相同的方式"删除"目录.重新启动时保留操作顺序 - 首先删除文件,然后删除目录.

    2023-02-03 10:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有