Предотвратить вмешательство проводника Windows в операции каталога

Иногда после запуска этого кода не остается каталога «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 сохраняет ссылку на папку, поэтому последний CreateDirectory не имеет ничего общего, но тогда исходная папка удаляется. Как я могу исправить код?

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

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

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


person Bruno Martinez    schedule 27.04.2010    source источник
comment
Можете ли вы предоставить немного больше информации о том, чего вы пытаетесь достичь?   -  person Brian Gideon    schedule 27.04.2010


Ответы (1)


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

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

Directory.Delete(folder, false);

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

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

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

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

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

person Nayan    schedule 27.04.2010
comment
Я разъяснил вопрос и надеюсь, что теперь он имеет больше смысла. - person Bruno Martinez; 29.04.2010
comment
Мой ответ остается прежним. Ваша папка не удаляется, потому что какое-то приложение все еще обращается к ней, отсюда и блокировка. После того, как блокирующие приложения исчезнут, папку можно будет удалить. Блокирующее приложение может быть вашим проводником или даже ничего не подозревающим антивирусом! Вы можете отложить удаление на несколько миллисекунд и повторить попытку. Или, если вы действительно хотите углубиться, найдите приложение блокировки и уничтожьте его. Попробуйте поискать исходный код WhoSLocking, чтобы понять, как найти блокирующие приложения. - person Nayan; 29.04.2010
comment
Папка УДАЛЕНА. Ошибка в том, что он не создан. Я думаю, что удаление-создание выполняются не в таком порядке. Удаление останавливается из-за проводника Windows, затем запускается создание, но ничего не происходит, поскольку каталог существует, и, наконец, каталог удаляется. Меня очень озадачивает, что ОС, похоже, не представляет последовательного представления файловой системы для моего процесса. - person Bruno Martinez; 30.04.2010
comment
Не могли бы вы указать исключения, возникающие в ходе этого процесса? Если их нет, не могли бы вы поставить точку останова на CreateDirectory и, прежде чем продолжить, проверить, действительно ли папка удалена или нет. Затем перешагните через CreateDirectory и проверьте, создана папка или нет. Они помогут понять, что происходит. Опять же: не забудьте опубликовать исключения, которые вы получили. - person Nayan; 30.04.2010
comment
Я не получаю никаких исключений. Вы запускали код? Каталог всегда существует после запуска кода? - person Bruno Martinez; 01.05.2010
comment
Хм... кажется, я получаю исключение в VS 2010, если я создаю папку в каталоге foo перед запуском программы. System.IO.IOException was unhandled - Message=The directory is not empty. Я рекомендую вам разработать несколько тестовых примеров и запустить их. Вы можете опубликовать их здесь, если хотите проверить их интеллект. знак равно - person Nayan; 02.05.2010