如何确保我可以替换目录中的文件?

时间:2010-05-11 22:01:06

标签: c# .net file directory locking

我想完全将文件系统上的一个目录替换为临时目录中的另一个目录。棘手的部分是可以随时使用要替换的文件夹中的文件,导致替换操作失败。

我需要以某种方式等待对目录的独占锁定,以便我可以删除所有内容而不会失败,因此我可以移动其他目录来替换它。

为了使问题更加困难,可能使用这些文件的过程是我自己的(通过Lucene.net库并且不在我手中)。所以它不能是进程级锁,它必须是对象级锁。

有关我如何做到这一点的任何想法?或者我应该继续重新尝试,直到成功为止?我想这总是一个选择。

3 个答案:

答案 0 :(得分:1)

Microsoft的InUse.exe实用程序将完成此操作,但它需要重新启动计算机才能使更改生效。更多信息: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 :(得分:1)

SLaks的回答是错误的,如果它包含正在使用的文件,则无法重命名整个目录。

但是,您可以重命名或移动正在使用的文件。我不知道这是否适用于所有版本的Windows,但我知道它确实在Windows 7中。如果程序打开文件,它将保持打开状态,但如果某些内容在移动后尝试打开文件,则显然不会再存在了。

因此,您实际上可以使用它来替换正在运行的可执行文件,但如果可执行文件尝试加载其所依赖的.dll之一,那么它也会被移动,应用程序将在最终用户上崩溃。

根据您要替换的内容,您可以创建一个目录以便最终删除,将要替换的每个文件移动到该目录中,复制新文件,并在完成后尝试删除temp目录中的每个文件。然后,如果剩下任何文件,您可以将其标记为最终删除:

"MoveFile" function in C# (Delete file after reboot)


经过进一步的实验,我发现,您可以移动正在使用的文件,但仅限于某些情况下。如果您使用“ShareDelete”文件访问它打开文件,则它可以正常工作。它似乎也适用于运行可执行文件和dll ...即使它们无法删除也可以移动它们。但是正常打开的文件(例如“File.OpenRead()”)仍将提供“正在使用的文件”IOException。

答案 2 :(得分:0)

如果要替换整个目录,可以重命名原始目录,然后将新目录重命名为原始目录。