26

我正在尝试将目录从一个位置移动到同一驱动器上的另一个位置。我收到“当该文件已存在时无法创建文件”错误。下面是我的代码。

有人可以对此提出建议吗?

        string sourcedirectory = @"F:\source";
        string destinationdirectory = @"F:\destination";

        try
        {
            if (Directory.Exists(sourcedirectory))
            {
                if (Directory.Exists(destinationdirectory))
                {
                  Directory.Move(sourcedirectory, destinationdirectory);
                }
                else
                {
                  Directory.CreateDirectory(destinationdirectory);
                  Directory.Move(sourcedirectory, destinationdirectory);
                }
            }

        }
        catch (Exception ex)
        {
            log(ex.message);
        }
4

5 回答 5

23

正如前面两个答案所指出的,目标目录不存在。在您的代码中,如果目录不存在,您将创建目录,然后尝试移动您的目录,移动方法将为您创建目录。如果目录已经存在,您将需要删除它或移动它。

像这样的东西:

class Program
{
    static void Main(string[] args)
    {
        string sourcedirectory = @"C:\source";
        string destinationdirectory = @"C:\destination";
        string backupdirectory = @"C:\Backup";
        try
        {
            if (Directory.Exists(sourcedirectory))
            {
                if (Directory.Exists(destinationdirectory))
                {
                    //Directory.Delete(destinationdirectory);
                    Directory.Move(destinationdirectory, backupdirectory + DateTime.Now.ToString("_MMMdd_yyyy_HHmmss"));
                    Directory.Move(sourcedirectory, destinationdirectory);
                }
                else
                {
                    Directory.Move(sourcedirectory, destinationdirectory);
                }
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }
}
于 2012-10-01T06:08:37.903 回答
4

您不需要先创建目录,它会抛出 IO 异常,如果目标目录存在,Move方法会自动为您创建它:

string sourcedirectory = @"F:\source";
string destinationdirectory = @"F:\destination";

if (Directory.Exists(sourcedirectory))
{
    if (!Directory.Exists(destinationdirectory))
    {
         Directory.Move(sourcedirectory, destinationdirectory);
    }
}

更多信息Directory.Move

http://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx

于 2012-10-01T06:11:31.240 回答
4

来自http://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx

“例如,如果您尝试将 c:\mydir 移动到 c:\public,并且 c:\public 已经存在,则此方法会引发 IOException。您必须将“c:\public\mydir”指定为 destDirName 参数,前提是“c:\public”下不存在“mydir”,或者指定一个新的目录名称,例如“c:\newdir”。”

于 2012-10-01T05:12:03.650 回答
2

根据MSDN

例如,如果您尝试将 c:\mydir 移动到 c:\public,并且 c:\public 已经存在,则此方法将引发 IOException。

但是,在您的方法中,您是在移动之前创建目标目录。

所以,你需要改变你的方法

if (Directory.Exists(destinationdirectory))
{
  Directory.Move(sourcedirectory, destinationdirectory);
}
else
{
  Directory.CreateDirectory(destinationdirectory);
  Directory.Move(sourcedirectory, destinationdirectory);
}

if (Directory.Exists(destinationdirectory))
{
  //delete or rename
}
Directory.Move(sourcedirectory, destinationdirectory);
于 2012-10-01T06:12:43.480 回答
0

你可以打电话

Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory(source, destination, true);

它在内部所做的是,如果目标目录不存在,它会创建它,然后遍历源目录的文件并将它们移动到目标目录。这样就不会出现“文件已存在时无法创建文件”的问题。

您需要添加Microsoft.VisualBasic作为参考。

于 2016-07-27T02:32:50.177 回答