Как убедиться, что я могу заменить файлы в каталоге? - PullRequest
2 голосов
/ 12 мая 2010

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

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

Чтобы сделать вещи потенциально более сложными, процесс, который, вероятно, будет использовать файлы, - мой (через библиотеку Lucene.net и не в моих руках). Таким образом, это не может быть блокировка на уровне процесса, это должна быть блокировка на уровне объекта.

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

Ответы [ 3 ]

1 голос
/ 11 июля 2010

Утилита InUse.exe от Microsoft сделает это, однако для того, чтобы изменения вступили в силу, необходимо перезагрузить компьютер. Дополнительная информация: http://support.microsoft.com/kb/228930

Пример использования:

c:\Program Files (x86)\Resource Kit>inuse C:\temp\new C:\temp\old /y
InUse - version 1.4
---------------------------------------------------------------------------
Copyright (c) 1994-1999 Microsoft Corporation. All rights reserved
Windows 2000 detected - WFP is enforced
Confirmation suppressed

INUSE is about to replace the following file

        Existing:    C:\temp\old
        No version info available

        Replacement: C:\temp\new
        No version info available

        C:\temp\new is replacing --> C:\temp\old

Changes will not take affect until you reboot.
1 голос
/ 14 января 2013

SLaks ответ неправильный, вы не можете переименовать весь каталог, если он содержит используемые файлы.

Однако вы можете переименовывать или перемещать используемые файлы. Я не знаю, работает ли это во всех версиях Windows, но я знаю, что это, безусловно, работает в Windows 7. Если программа имеет открытый файл, он останется открытым, но если что-то попытается открыть файл после перемещения, он очевидно, там больше не будет.

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

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

Функция «MoveFile» в C # (удаление файла после перезагрузки)


После дальнейших экспериментов я обнаружил, что вы можете перемещать файлы, которые используются, но только при определенных обстоятельствах. Если вы откроете файл с доступом к файлу «ShareDelete», он будет работать. Он также работает с исполняемыми файлами и библиотеками ... их можно перемещать, даже если их нельзя удалить. Но файл, который был открыт нормально (например, с помощью «File.OpenRead ()»), все равно выдаст исключение IOException для используемого файла.

0 голосов
/ 12 мая 2010

Если вы заменяете весь каталог, вы можете переименовать исходный каталог, а затем переименовать в новый каталог с оригинальным именем.

...