VC ++ CLI / CLR удалить файлы / папки по сети - PullRequest
0 голосов
/ 19 марта 2011

Я хочу удалить файлы из сети ПК. Пользователь имеет полный контроль над общей папкой на ПК, из которой удаляются файлы. У меня есть этот код:

if(status)
        {
            if(File::Exists(selectedfile))
                System::IO::File::Delete(selectedfile);
            else
                MessageBox::Show("File does not exist.");

        }
        else
        {   
            if(!System::IO::Directory::Exists(selectedfile))
                MessageBox::Show("The directory does not exists.");
            try{
                System::IO::Directory::Delete(selectedfile,true);
                if(System::IO::Directory::Exists(selectedfile))
                {
                    deleted =false;
                    System::IO::Directory::Delete(selectedfile,true);
                }
                else
                    deleted = true;
            }

Я включил второе удаление в цикл Каталога, поскольку папка не удаляется с первой попытки, удаляются только файлы внутри папки. Однако при попытке удалить пустую папку я получаю отказ в доступе.

Как убедиться, что каталог и все его содержимое удалены.

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Это вполне нормально, одна из вещей, которую должна выполнять многозадачная операционная система. Каталог фактически помечен для удаления, но его пока нельзя удалить, поскольку один или несколько процессов имеют дескриптор, открытый в каталоге. В случае с Windows это обычно процесс, который использует каталог в качестве рабочего каталога по умолчанию. Или, может быть, у вас открыто окно проводника, в котором вы видите, как ваша программа выполняет свою работу. Проводник использует ReadDirectoryChangesW (), чтобы получать уведомления об изменениях в каталоге, чтобы он знал, когда обновлять представление.

Каталог будет физически удален с диска, как только последний дескриптор будет закрыт. Хотя он существует в этом зомбированном состоянии, любая попытка что-либо сделать с каталогом приведет к ошибке доступа (код ошибки Windows 5).

Вам необходимо учитывать это поведение в вашей программе. Определенно удалите второй тест Directory :: Exists (), если вы не получили исключение из вызова Delete, вам нужно будет предположить, что каталог был удален. Это будет точно, в конце концов.

0 голосов
/ 19 марта 2011

Вам нужны функции файлового сервера на компьютерах A и B и написать клиент на компьютере C.

  • Сервер может быть своего рода FTP-сервером, где вы должны подробно настроить, какие каталоги обрабатываются на обоих сайтах.

  • Сервер может быть общим ресурсом Windows. Вы можете использовать имена файлов UNC для адресации этих файлов и использовать Windows API на компьютере C. Когда вы подключили сетевые диски на компьютере C, вы можете работать с сетевыми файлами так же, как с локальными файлами.
    Компьютеры A и B должны быть настроены таким образом, чтобы были общие ресурсы с достаточными правами.

...