I want to move a directory from one location to another using C# .NET. I used Directory.Move or even DirectoryInfo (with MoveTo) this simple way:

// source is: "C:\Songs\Elvis my Man" // newLocation is: "C:\Songs\Elvis" try { // Previous command was: Directory.Move(source, newLocation); DirectoryInfo dir = new DirectoryInfo(source); dir.MoveTo(newLocation); } catch (Exception e) { Console.WriteLine("Error: "+ e.Message); } 

But action that's being done (for both cases) is renaming the folder name from 'source' to 'newLocation'

What I expected? that folder "Elvis my man" will be now in "Elvis" folder.

What has happened? "Elvis my man" was changed to "Elvis" (Renamed). If the directory "Elvis" is already exists, it can't change it to "Elvis" (cause he can't make a duplicate names), therefore I get an exception saying that.

What am I doing wrong??

Many thanks!!!

4 Answers

I would advise putting validation around the Move command to ensure that the source location does exists and the destination location doesn't exists.

I've always found it easier to avoid the exceptions than handle them once they do occur.

You'll probably want to include exception handling as well, just in case the access permissions are a problem or a file is open and can't be moved...

Here's some sample code for you:

 string sourceDir = @"c:\test"; string destinationDir = @"c:\test1"; try { // Ensure the source directory exists if (Directory.Exists(sourceDir) == true ) { // Ensure the destination directory doesn't already exist if (Directory.Exists(destinationDir) == false) { // Perform the move Directory.Move(sourceDir, destinationDir); } else { // Could provide the user the option to delete the existing directory // before moving the source directory } } else { // Do something about the source directory not existing } } catch (Exception) { // TODO: Handle the exception that has been thrown } 

Even though this works in the command line to move a file, when programming you need to provide the full new name.

So you'd need to change newLocation to "C:\Songs\Elvis\Elvis my Man" to make this work.

From MSDN,

This method throws an IOException if, for example, you try to move c:\mydir to c:\public, and c:\public already exists. You must specify "c:\public\mydir" as the destDirName parameter, or specify a new directory name such as "c:\newdir".

It looks like you need to set newLocation to C:\Songs\Elvis\Elvis my man

 private void moveDirectory(string fuente,string destino) { if (!System.IO.Directory.Exists(destino)) { System.IO.Directory.CreateDirectory(destino); } String[] files = Directory.GetFiles(fuente); String[] directories = Directory.GetDirectories(fuente); foreach (string s in files) { System.IO.File.Copy(s, Path.Combine(destino,Path.GetFileName(s)), true); } foreach(string d in directories) { moveDirectory(Path.Combine(fuente, Path.GetFileName(d)), Path.Combine(destino, Path.GetFileName(d))); } } 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy