Directory.Move doesn't work (file already exist)

匿名 (未验证) 提交于 2019-12-03 02:50:02

问题:

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

回答1:

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();     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); }


回答2:

The destination directory should not already exist - the Directory.Move method creates the destination directory for you.



回答3:

ProcessStartInfo p = new ProcessStartInfo("cmd", "/c move \"c:\\test\\Movies\" \"c:\\test\Test\\""); p.WindowStyle = ProcessWindowStyle.Hidden; //hide mode Process.Start(p);


回答4:

Is it safe for you to delete the destination folder before copying new contents to it?

    Directory.Delete(@"c:\test\test");     Directory.Move(@"c:\test\movies",@"c:\test\test");


回答5:

The most common 2 reasons why Directory.Move could fail are, if:

  • It's a different volume (you need to Copy/Delete)
  • It already exists (doesn't support overwrite by default)

Here is my simple solution for the second problem (overwrite):

public bool MoveDirectory(string sourceDirName, string destDirName, bool overwrite) {     if (overwrite && Directory.Exists(destDirName))     {         var needRestore = false;         var tmpDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());         try         {             Directory.Move(destDirName, tmpDir);             needRestore = true; // only if fails             Directory.Move(sourceDirName, destDirName);             return true;         }         catch (Exception)         {             if (needRestore)             {                 Directory.Move(tmpDir, destDirName);             }         }         finally         {             Directory.Delete(tmpDir, true);         }     }     else     {         Directory.Move(sourceDirName, destDirName); // Can throw an Exception         return true;     }     return false; }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!