我Users
从域中删除用户后,我试图删除文件夹中的用户配置文件文件夹.问题是有时系统可能正在使用该文件夹.
问题是使用MOVEFILE_DELAY_UNTIL_REBOOT
具有MoveFileEx
将只能删除空文件夹.
来自MSDN:
如果dwFlags指定MOVEFILE_DELAY_UNTIL_REBOOT且lpNewFileName为NULL,则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
将在文件夹中的文件之前列出文件夹,因此删除将失败.
在我见过的大多数实现中,目录中的每个文件都被"删除" MoveFileEx
了MOVEFILE_DELAY_UNTIL_REBOOT
,然后以相同的方式"删除"目录.重新启动时保留操作顺序 - 首先删除文件,然后删除目录.