删除无法访问的文件和文件夹

时间:2018-04-25 13:36:01

标签: c# tortoisesvn

我的问题是我必须删除机器上的文件和文件夹,这是我自己创建的。没什么特别的,但是我使用了不同的工具(TortoiseSVN,特殊的自定义工具等等),我无法保证在关闭我自己的应用程序后它们全部关闭。 (例如:TortoiseSVN始终运行)

我在AppData / Local / temp的Windows Temp文件夹中工作,也许Virus-Scanner也阻止了该目录。

我已经尝试过:

  1. DirectoryInfo.Delete(true):--- IOException
  2. Foreach FileInfo和DirectryInfo.Delete ----相同的结果=> IOException
  3. 将文件和文件夹保存在列表中并轮询无限以删除---最佳结果,但如果用户先关闭,文件和文件夹保存在Temp
  4. 通过DllImport导入moveFileEx ---但重启后不会删除!
  5. 在每个文件上尝试moveFileEx并折叠(文件优先)---相同的结果,不删除
  6. 在我开始创建 Windows服务以删除所有文件之前,我希望我们能找到另一种解决方案。

    PS:在Windows 10 64位上进行测试并使用C#WPF Visual Studio 2017教授

    进行编写

    我的moveFileEx代码:

    internal enum MoveFileFlags
        {
            MOVEFILE_REPLACE_EXISTING = 1,
            MOVEFILE_COPY_ALLOWED = 2,
            MOVEFILE_DELAY_UNTIL_REBOOT = 4,
            MOVEFILE_WRITE_THROUGH = 8,
            MOVEFILE_CREATE_HARDLINK_RESERVER = 16,
            MOVEFILE_FAIL_IF_NOT_TRACKABLE = 32
        }
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
    
        public static void MoveFileUntilReboot(this FileInfo source , FileInfo Destination)
        {
            MoveFileEx(source.FullName, Destination.FullName, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
        }
        public static void DeleteFileUntilReboot(this FileInfo toDelete)
        {
            MoveFileEx(toDelete.FullName, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
        }
        public static void MoveDirUntilReboot(this DirectoryInfo source, DirectoryInfo Destination)
        {
            MoveFileEx(source.FullName, Destination.FullName, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
        }
        public static void DeleteDirUntilReboot(this DirectoryInfo source)
        {
            if (source == null) return;
            if (source.Exists == false) return;
    
    
            Parallel.ForEach(source.GetDirectories(), (dir) => { dir.DeleteDirUntilReboot(); });
    
            Parallel.ForEach(source.GetFiles(), (File) => { File.DeleteFileUntilReboot(); });
    
        }
    

0 个答案:

没有答案