Предотвратить Windows Explorer от вмешательства в операции каталога - PullRequest
2 голосов
/ 27 апреля 2010

Иногда после выполнения этого кода каталог "foo" не остается:

string folder = Path.Combine(Path.GetTempPath(), "foo");
if (!Directory.Exists(folder))
    Directory.CreateDirectory(folder);
Process.Start(@"c:\windows\explorer.exe", folder);
Thread.Sleep(TimeSpan.FromSeconds(5));
Directory.Delete(folder, false);
Directory.CreateDirectory(folder);

Кажется, Windows Explorer сохраняет ссылку на папку, поэтому последний CreateDirectory не имеет ничего общего, но затем исходная папка удаляется. Как я могу исправить код?

EDIT: Мне жаль, что мой вопрос не был ясен. Моя цель - создать пустой каталог "foo". Если каталог уже существует, я удаляю его и создаю заново. Проблема заключается в том, что если проводник Windows просматривает каталог, вызов CreateDirectory иногда завершается сбоем. Никаких исключений не возникает; каталог просто не создан.

Код выше воспроизводит проблему на моем компьютере. Только последние две строки принадлежат моему фактическому заявлению. Предыдущие строки настроены. После запуска кода всегда ли существует «foo»? Это не тот случай, половину времени у меня на компьютере.

В настоящее время я вручную удаляю каждый файл и подкаталог foo.

1 Ответ

1 голос
/ 27 апреля 2010

Поскольку вы не предоставили подробности (например, исключения, ошибки), я предполагаю, что это проблема.

Я думаю, что проблема в том, что проводник все еще работает, когда вы запускаете команду для удаления папки,Это может быть проблема с блокировкой.

Directory.Delete(folder, false);

Либо это, либо какое-то другое приложение обращается к этой папке или ее подпапкам или файлам , если таковые имеются случайно.

Я бы порекомендовал не прикасаться к папке через проводник или любое другое приложение, если это возможно, и дождаться первого выхода обозревателя, прежде чем удалять папку.

        Process p = Process.Start(@"c:\windows\explorer.exe", folder);
        Thread.Sleep(TimeSpan.FromSeconds(5));
        p.WaitForExit(); //<-------
        Directory.Delete(folder, false);

ТакжеПожалуйста, не игнорируйте исключения и ошибки и вставьте их сюда, если они есть.

Надеюсь, это поможет.

...