如何标记删除文件夹C#

如何在使用C#重新引导系统时标记一个要删除的文件夹。

谢谢,

http://abhi.dcmembers.com/blog/2009/03/24/mark-file-for-deletion-on-reboot/

/// /// Consts defined in WINBASE.H /// internal enum MoveFileFlags { MOVEFILE_REPLACE_EXISTING = 1, MOVEFILE_COPY_ALLOWED = 2, MOVEFILE_DELAY_UNTIL_REBOOT = 4, MOVEFILE_WRITE_THROUGH = 8 } /// <summary> /// Marks the file for deletion during next system reboot /// </summary> /// <param name="lpExistingFileName">The current name of the file or directory on the local computer.</param> /// <param name="lpNewFileName">The new name of the file or directory on the local computer.</param> /// <param name="dwFlags">MoveFileFlags</param> /// <returns>bool</returns> /// <remarks>http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx</remarks> [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll",EntryPoint="MoveFileEx")] internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags); //Usage for marking the file to delete on reboot MoveFileEx(fileToDelete, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT); 

使用PInvoke并调用MoveFileEx,传入null作为目的地….

这个链接有一些示例代码:

 [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, int dwFlags); public const int MOVEFILE_DELAY_UNTIL_REBOOT = 0x4; MoveFileEx(filename, null, MOVEFILE_DELAY_UNTIL_REBOOT); 

引自http://abhi.dcmembers.com/blog/2009/03/24/mark-file-for-deletion-on-reboot/

 /// /// Consts defined in WINBASE.H /// internal enum MoveFileFlags { MOVEFILE_REPLACE_EXISTING = 1, MOVEFILE_COPY_ALLOWED = 2, MOVEFILE_DELAY_UNTIL_REBOOT = 4, MOVEFILE_WRITE_THROUGH = 8 } /// <summary> /// Marks the file for deletion during next system reboot /// </summary> /// <param name="lpExistingFileName">The current name of the file or directory on the local computer.</param> /// <param name="lpNewFileName">The new name of the file or directory on the local computer.</param> /// <param name="dwFlags">MoveFileFlags</param> /// <returns>bool</returns> /// <remarks>http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx</remarks> [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll",EntryPoint="MoveFileEx")] internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags); //Usage for marking the file to delete on reboot MoveFileEx(fileToDelete, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT); 

编辑:殴打

问题是使用MOVEFILE_DELAY_UNTIL_REBOOT MoveFileEx将只删除空的文件夹。 参考文档。

我的解决方案如下:使用MOVEFILE_DELAY_UNTIL_REBOOT将目录中的每个文件都用MoveFileEx“删除”,然后以相同的方式“删除”目录。

 public class Cleanuper { private void PendingDeleteDirectory(string directoryPath) { foreach (string directory in Directory.GetDirectories(directoryPath, "*", SearchOption.TopDirectoryOnly)) { PendingDeleteDirectory(directory); } foreach (string file in Directory.GetFiles(directoryPath, "*", SearchOption.TopDirectoryOnly)) { NativeMethods.MoveFileEx(file, null, MoveFileFlags.DelayUntilReboot); } NativeMethods.MoveFileEx(directoryPath, null, MoveFileFlags.DelayUntilReboot); } } public static class NativeMethods { [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags); } [Flags] public enum MoveFileFlags { DelayUntilReboot = 0x00000004 }