Directory.Move不起作用(文件已经存在) [英] Directory.Move doesn't work (file already exist)

查看:494
本文介绍了Directory.Move不起作用(文件已经存在)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有主文件夹:

  C:\\测试

和有我有2个文件夹:电影和照片

照片与具有相同结构的文件三个文件夹:人物,动物和建筑物。我想这code:

  Directory.Move(@C:\\测试\\电影,@C:\\测试\\测试);

我得到异常:

 文件已存在


解决方案

此方法将移动递归文件夹的内容,并覆盖现有文件。

你应该添加一些异常处理。

编辑:

这种方法是用whil​​e循环和堆栈代替递归实现。

 公共静态无效MoveDirectory(字符串源,目标字符串)
{
    VAR堆栈=新的堆栈<&文件夹GT;();
    stack.Push(新文件夹(源,目标));    而(stack.Count大于0)
    {
        变种夹= stack.Pop();
        Directory.CreateDirectory(folders.Target);
        的foreach(在Directory.GetFiles(folders.Source,var文件*。*))
        {
             字符串的TargetFile = Path.Combine(folders.Target,Path.GetFileName(文件));
             如果(File.Exists(的TargetFile))File.Delete(的TargetFile);
             File.Move(文件的TargetFile);
        }        的foreach(在Directory.GetDirectories VAR文件夹(folders.Source))
        {
            stack.Push(新文件夹(文件夹,Path.Combine(folders.Target,Path.GetFileName(文件夹))));
        }
    }
    Directory.Delete(源,真正的);
}
公共类文件夹
{
    公共字符串源{搞定;私人集; }
    公共字符串目标{搞定;私人集; }    公共文件夹(源字符串,目标字符串)
    {
        来源=来源;
        目标=目标;
    }
}

更新:结果
这是一个简单的版本与使用 Directory.EnumerateFiles 递归而不是使用堆栈。结果
这只会在.NET 4中工作或更高版本,我们将其与.NET变化的早期版本 Directory.EnumerateFiles Directory.GetFiles

 公共静态无效MoveDirectory(字符串源,目标字符串)
{
    VAR SOURCEPATH = source.TrimEnd('\\\\','');
    VAR TARGETPATH​​ = target.TrimEnd('\\\\','');
    var中的文件= Directory.EnumerateFiles(SOURCEPATH,*,SearchOption.AllDirectories)
                         .GroupBy(S => Path.GetDirectoryName(S));
    的foreach(在文件夹VAR)
    {
        VAR targetFolder = folder.Key.Replace(SOURCEPATH,TARGETPATH​​);
        Directory.CreateDirectory(targetFolder);
        的foreach(文件夹var文件)
        {
            变种的TargetFile = Path.Combine(targetFolder,Path.GetFileName(文件));
            如果(File.Exists(的TargetFile))File.Delete(的TargetFile);
            File.Move(文件的TargetFile);
        }
    }
    Directory.Delete(源,真正的);
}

I've got main folder:

c:\test

And there I have 2 folders: Movies and Photos.

Photos has three folders with files with the same structure: People, Animals and Buildings. I'm trying this code:

Directory.Move(@"c:\test\Movies", @"c:\test\Test");

I get exception:

File already exists

解决方案

This method will move content of a folder recursively and overwrite existing files.
You should add some exception handling.
Edit:
This method is implemented with a while loop and a stack instead of recursion.

public static void MoveDirectory(string source, string target)
{
    var stack = new Stack<Folders>();
    stack.Push(new Folders(source, target));

    while (stack.Count > 0)
    {
        var folders = stack.Pop();
        Directory.CreateDirectory(folders.Target);
        foreach (var file in Directory.GetFiles(folders.Source, "*.*"))
        {
             string targetFile = Path.Combine(folders.Target, Path.GetFileName(file));
             if (File.Exists(targetFile)) File.Delete(targetFile);
             File.Move(file, targetFile);
        }

        foreach (var folder in Directory.GetDirectories(folders.Source))
        {
            stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder))));
        }
    }
    Directory.Delete(source, true);
}
public class Folders
{
    public string Source { get; private set; }
    public string Target { get; private set; }

    public Folders(string source, string target)
    {
        Source = source;
        Target = target;
    }
}

Update:
This is a simpler version with the use of Directory.EnumerateFiles recursively instead of using a stack.
This will only work with .net 4 or later, to us it with an earlier version of .net change Directory.EnumerateFiles to Directory.GetFiles.

public static void MoveDirectory(string source, string target)
{
    var sourcePath = source.TrimEnd('\\', ' ');
    var targetPath = target.TrimEnd('\\', ' ');
    var files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
                         .GroupBy(s=> Path.GetDirectoryName(s));
    foreach (var folder in files)
    {
        var targetFolder = folder.Key.Replace(sourcePath, targetPath);
        Directory.CreateDirectory(targetFolder);
        foreach (var file in folder)
        {
            var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
            if (File.Exists(targetFile)) File.Delete(targetFile);
            File.Move(file, targetFile);
        }
    }
    Directory.Delete(source, true);
}

这篇关于Directory.Move不起作用(文件已经存在)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆