gpt4 book ai didi

c# - 重新启动时删除非空文件夹

转载 作者:行者123 更新时间:2023-11-30 13:37:44 25 4
gpt4 key购买 nike

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

问题是将 MOVEFILE_DELAY_UNTIL_REBOOTMoveFileEx 一起使用只会删除空文件夹。

From the MSDN :

If dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts. If lpExistingFileName refers to a directory, the system removes the directory at restart only if the directory is empty.

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


这是一个基于 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.EnumerateFilesDirectory.EnumerateDirectories 在两个循环中执行此操作,因为 Directory.EnumerateFileSystemEntries 将在文件之前列出文件夹文件夹,因此删除会失败。

最佳答案

在我见过的大多数实现中,目录中的每个文件都使用 MoveFileExMOVEFILE_DELAY_UNTIL_REBOOT“删除”,然后目录被“删除”同样的方式。重新启动时会保留操作顺序 - 首先删除文件,然后删除目录。

关于c# - 重新启动时删除非空文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21097793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com