Directory.Move():进程无法访问该文件,因为它正被另一个进程使用?

时间:2013-12-09 16:08:55

标签: c# .net winforms file

在我的下面的代码中,我试图将位于一个文件夹中的所有.doc文件移动到另一个文件夹中。在生产中,这将生成创建文件夹C:\Temp\的文件移动到具有数据库作业的网络文件夹,该文件夹作业每隔5分钟将文件从网络文件夹移动到我们的文档想象存档系统中。

在尝试下面的测试代码时,我会收到"The process cannot access the file because it is being used by another process."

CODE:

public void moveLocalToCommitFYI()
        {
            // MOVE DOCS FORM TEMP FOLDER TO COMMITFYI FOLDER
            string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\";
            string dirDest = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\DestTest\";

            try
            {
                Directory.Move(dirSource, dirDest);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
            }
        }

对我来说很奇怪的是,当我直接指定一个源文件并且它是目的地时,代码运行正常:

public void moveLocalToCommitFYI()
        {
            // MOVE DOCS FORM TEMP FOLDER TO COMMITFYI FOLDER
            string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTestFile.doc";
            string dirDest = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\MoveTestFile.doc";

            try
            {
                Directory.Move(dirSource, dirDest);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
            }
        }

当然有一种方法可以将所有.doc文件从一个目录移动到另一个目录而无需循环并指定每个单独的文件名吗?

修改

修改了我的目标文件夹是我桌面上的不同文件夹而不是子文件夹。 dirSource包含5个单词文档,目标目录(我桌面上的\ MoveTest \)不包含任何文件:

string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\";
            string dirDest = @"C:\Users\NAME\Desktop\MoveTest\";

这会生成"Cannot create a file when that file already exists"

基于此,我假设代码实际上是将设置目录文件夹及其所有内容从一个位置移动到另一个位置,因此我将代码修改为以下内容:

string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\";
            string dirDest = @"C:\Users\NAME\Desktop\MoveTest2\";

这摆脱了我在\ Desktop \ CommitTest \中的子文件夹\ MoveTest \并创建了文件夹\ Desktop \ MoveTest2。

我有没有办法移动文件夹的内容而不删除源文件夹并将它们放入已创建的目的地?

2 个答案:

答案 0 :(得分:2)

您的测试代码正在尝试将整个目录移动到其自身内的目录中。这不是有效的操作。您的实际代码可能正在尝试将整个Temp目录移动到另一个位置。这与将其中的所有文件移动到另一个目录不同。

您必须遍历所有文件名并单独移动每个文件。

var files = Directory.EnumerateFiles(dirSource, "*.doc")
                     .Select(path => new FileInfo(path));
foreach (var file in files)
    file.MoveTo(Path.Combine(dirDest, file.Name));

如果您发现个别移动会给网络流量增加太多开销(如果这是一个缓慢的Internet连接而不是快速本地连接,则尤为重要),您可能希望压缩所有doc文件(例如, ZipFile)在将它们传输到服务器之前,然后让服务器解压缩它们。这种压缩可能会降低整体大小,而传输一个文件而不是多个文件会减少网络开销。

答案 1 :(得分:0)

您无法移动本身下面的文件夹。你需要找到它的所有内容并移动它们。或者这样做:将MoveTest重命名为MoveTest2,创建一个新的MoveTest目录,现在您可以在其下移动MoveTest。