Моя проблема в том, что Я должен удалить файлы и папки на машине , которую я создал сам.Ничего особенного, но я использую различные инструменты (TortoiseSVN, специальные пользовательские инструменты и т. Д.), Которые я не могу гарантировать, что все они закрываются после закрытия моего собственного приложения.(например: TortoiseSVN работает всегда)
Я работаю в папке Windows Temp в AppData / Local / temp и, возможно, Virus-Scanner тоже блокирует каталог.
Что у меня уже естьпробовал:
- DirectoryInfo.Delete (true): ---
IOException
- Foreach FileInfo и DirectryInfo.Delete ---- один и тот же результат =>
IOException
- Сохранение файлов и папок в списке и бесконечный опрос для удаления - лучший результат, но если пользователь отключается первым, файлы и папки сохраняются в Temp
- Импорт moveFileEx через DllImport --- но он не удаляется после перезагрузки!
- Попробуйте 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(); });
}