Странная ситуация удаления и создания каталогов - PullRequest
4 голосов
/ 19 апреля 2009

У меня возникла странная ситуация, когда быстрое удаление и создание каталогов в Windows Server 2008 приводит к некоторым странным ошибкам. Иногда я получаю IOException, однажды у меня было NotAuthorizedException.

Вот мой код, который работает, но при переходе через отладчик выдается множество исключений. На самом деле, я только что получил IOException с «каталог не пустой» при выполнении directory.delete!

Обновление Многие из ответов посвящены неатомарному созданию каталогов, задержкам записи и т. Д. Существует ли 100% гарантированный способ сделать эту работу? В идеале я хотел бы, чтобы какой-нибудь системный вызов был «DeleteDirectoryAndWaitForTheDirectoryToBeDeleted» и соответствующий системный вызов «CreateDirectoryAndWaitForTheDirectoryToBeCreated».

Еще одно обновление Я взял приведенный ниже код Нейла и попробовал его на своей машине, и он довольно быстро вышел из строя (после 20 циклов). Кажется, что происходит, что служба IDriveE имеет доступ к каталогу, и попытка создать каталог завершается неудачно с DELETE PENDING. Полагаю, мне нужно еще раз исследовать такие вещи, как DELETE PENDING.

Лично мне не нравится этот код, так как он "пахнет" неправильно - но он работает.

Console.WriteLine("CleanAndCreateDirectory: {0}", baseDirectory);
while (Directory.Exists(baseDirectory))
{
    Console.WriteLine("DeleteDirectory: {0}", baseDirectory);
    try
    {
        Directory.Delete(baseDirectory, true);
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex.Message);
        Thread.Sleep(1000);
    }
}

while (!Directory.Exists(baseDirectory))
{
    try
    {
        Directory.CreateDirectory(baseDirectory);
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex.Message);
    }
}

Мои подозрения - что-то, наблюдающее за файловой системой, которое вызывает задержки в некоторых операциях, но я понятия не имею, что.

Ответы [ 5 ]

4 голосов
/ 19 апреля 2009

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

2 голосов
/ 20 апреля 2009

Используйте FileSystemWatcher , чтобы перехватить удаление, а затем создать новый каталог.

2 голосов
/ 19 апреля 2009

Следующий код C ++ удаляет и воссоздает каталоги настолько быстро, насколько это возможно, без проблем на моем старом компьютере с Windows 2000. Возможно, вы захотите попробовать это или подобное на своей машине.

#include <iostream>
#include <direct.h>
using namespace std;

int main() {
    const char * DIRNAME = "testdir";
    try {
        while(1) {
            if ( rmdir( DIRNAME ) == -1 ) {
                throw "could not remove directory";
            }
            if ( mkdir( DIRNAME ) == -1 ) {
                throw "could not create directory";
            }
        }
    }
    catch( const char * s ) {
        cerr << "Error: " << s << endl;
    }
}
2 голосов
/ 19 апреля 2009

Windows также использует то, что называется «отложенная запись». Поэтому, если вы удаляете каталог, он не удаляется сразу, а просто помечается для удаления.

0 голосов
/ 19 апреля 2009

Проблема в том, что удаление каталога и всего его содержимого не является атомарной операцией. Поэтому, если что-то еще добавит файл в каталог после того, как код удаления «очистит» каталог, удаление каталога может завершиться неудачей.

Возможно, вы хотите иметь счет на ваших циклах, чтобы не зависать, если возникла реальная проблема с удалением или созданием.

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