Удаление файлов и папок, которые не доступны - PullRequest
0 голосов
/ 25 апреля 2018

Моя проблема в том, что Я должен удалить файлы и папки на машине , которую я создал сам.Ничего особенного, но я использую различные инструменты (TortoiseSVN, специальные пользовательские инструменты и т. Д.), Которые я не могу гарантировать, что все они закрываются после закрытия моего собственного приложения.(например: TortoiseSVN работает всегда)

Я работаю в папке Windows Temp в AppData / Local / temp и, возможно, Virus-Scanner тоже блокирует каталог.

Что у меня уже естьпробовал:

  1. DirectoryInfo.Delete (true): --- IOException
  2. Foreach FileInfo и DirectryInfo.Delete ---- один и тот же результат => IOException
  3. Сохранение файлов и папок в списке и бесконечный опрос для удаления - лучший результат, но если пользователь отключается первым, файлы и папки сохраняются в Temp
  4. Импорт moveFileEx через DllImport --- но он не удаляется после перезагрузки!
  5. Попробуйте moveFileEx для каждого файла и Fold (сначала файлы) - один и тот же результат, не удаляется

Прежде чем я начну создавать Службу Windows для удаления всех файлов, я надеюсь, что мы сможем найти другое решение.

PS: тестирование в 64-битной Windows 10 и запись в C # WPF Visual Studio Prof. 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(); });

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...