Как удалить сетевые исполняемые файлы, используемые во время сборки NAnt

Связано: Как принудительно удалить файл?

У меня есть сценарий NAnt, который выполняет полную сборку и развертывание в нашей среде разработки. Развертывание исполняемого файла C#.Net Win exe и используемых библиотек DLL включает их перемещение в сетевое расположение, где их запускают наши тестировщики и другие разработчики.

    <copy todir="${dest.dir}" overwrite="true" failonerror="false" >
        <fileset basedir="${source.dir}" >
            <include name="**/*" />
        </fileset>
    </copy>

Прямо сейчас сценарий вызывает задачу копирования с параметром Overwrite="true", но это не удается, если кто-либо запускает приложение, сообщая

Не удается скопировать «source.dll» в «dest.dll». Доступ к пути «dest.dll» запрещен.

«dest.dll» — одна из основных зависимостей EXE, скопированная вместе с ним. Прямо сейчас у меня есть один из двух способов: я либо выясняю, у кого он открыт, и прошу их выйти, либо я отправляю электронное письмо нашим системным инженерам, и они делают какое-то колдовство, чтобы удалить заблокированный файл. Могу ли я в любом случае включить в сценарий NAnt некоторые из моих собственных вуду, чтобы копирование файла всегда было успешным?


person Dov    schedule 24.07.2009    source источник


Ответы (1)


У вас есть несколько возможных вариантов.

Можно было бы написать пользовательскую задачу NAnt, которая использует P/Invoke для вызова либо UnlockFile или UnlockFileEx из Win32 API. Эта задача может обернуть операции разблокировки и копирования, поэтому вам нужно будет только вызвать новую задачу из сценария NAnt.

Другой вариант — использовать задачу NAnt exec и выполнить утилиту разблокировки командной строки перед попыткой копирования.

person Scott Dorman    schedule 17.08.2009
comment
Проблема в том, что это работает только для процессов на локальной машине. Я не думаю, что UnlockFile сможет разблокировать файл от другого пользователя на другом ящике. - person Dov; 17.08.2009
comment
Вы можете ознакомиться с некоторыми утилитами от SysInternals — technet.microsoft.com /en-us/sysinternals/default.aspx, чтобы узнать, есть ли утилиты командной строки, которые можно использовать и которые будут работать на удаленных компьютерах. - person Scott Dorman; 18.08.2009
comment
Кажется, что одна из этих утилит могла быть единственным способом сделать это, но я в основном сдался. - person Dov; 28.09.2009