File.Copy和File.Move之间的区别

时间:2011-07-22 12:55:36

标签: c# file file-io

现在我正在处理一个小应用程序,它在iss服务器上更新mssql的压缩数据库文件。

我更喜欢使用SSIS来组织流程。几天它运作良好,但后来开始出错。

在SSIS中,我使用“文件系统任务”的“移动文件”操作将生成的文件从文件夹移动到iss服务器的共享文件夹。如果失败,如果文件被锁定,则稍后再尝试。但我看到有时目标文件夹中的文件开始消失。

然后我决定编写自定义代码。我删除了“文件系统任务”并放置了“脚本任务”而不是它。并在其中写下几行。

string destinationFile, sourceFile;
destinationFile = Path.Combine(Dts.Variables["FileRemoteCopyLocation"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString());
 sourceFile = Path.Combine(Dts.Variables["OrginalFilePath"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString());


bool written = false;


 try
 {
     File.Copy(sourceFile, destinationFile, true);
     File.Delete(sourceFile);
     written = true;
 }
 catch(IOException) {
    //log it
 }


if (written)
     Dts.TaskResult = (int)ScriptResults.Success;
else
     Dts.TaskResult = (int)ScriptResults.Failure;

效果很好。但是我通过锁定目标文件来尝试它。我在Sql Server Management Studio中连接了目标文件(它是一个sdf文件)。而且令人惊讶的是它也有效。

我从操作系统尝试过,通过复制源文件并将其粘贴到目标位置。 Windows 7问我是否要覆盖它,我说是的,它覆盖了我用于另一个进程的文件(复制和替换),没有警告没有错误。 但如果尝试重命名或删除它不会让我这样做。或者,如果我尝试剪切并粘贴它(移动和替换),则表示“您需要获得执行此操作的权限”。

据我所知,“复制,删除”和“移动”是完全不同的事情。我仍然无法理解如何覆盖锁定的文件。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

File.Move方法可用于将文件从一个路径移动到另一个路径。此方法适用于磁盘卷,如果源和目标相同,则不会引发异常。

您无法使用Move方法覆盖现有文件。如果您尝试通过将同名文件移动到该目录来替换文件,则会出现IOException。 要解决此问题,您可以使用复制和删除方法的组合

来自Difference between in doing file copy/delete and Move

的答案

答案 1 :(得分:0)

虽然这个话题并不新鲜,但我还是想分享一下我的经验。我不得不更改数字图书馆中的 pdf 文件名。当我使用 File.Copy() 方法通过更改名称将大约 10,000 篇法律文章复制到另一个文件夹时,其中一半需要大约 15 分钟,我停止了该过程,因为它需要很长时间。然后当我用 File.Move() 方法尝试同样的事情时,结果对我来说是不可思议的:移动整个东西花了不到 1 分钟。当然,我不用多说,这些都与系统功能直接相关。