Santosh Kumar Bind
Santosh Kumar Bind

Reputation: 63

How to move subfolder with files to another directory in asp.net C#

I want to copy and paste sub-folders of source folder ABC To destination folder. But it is not working. Here is my C# code, it work's fine but it copies the whole folder instead of only the sub-folders.

// string fileName = "test.txt";
string sourcePath = "D:\\Shraddha\\Demo_Web_App\\Source";
string targetPath = "D:\\Shraddha\\Demo_Web_App\\Destination";

// Use Path class to manipulate file and directory paths.
string sourceFile = System.IO.Path.Combine(sourcePath);
string destFile = System.IO.Path.Combine(targetPath);

// To copy a folder's contents to a new location:
// Create a new target folder, if necessary.
if (System.IO.Directory.Exists(targetPath))
{
    System.IO.Directory.CreateDirectory(targetPath);
}

// To copy a file to another location and 
// overwrite the destination file if it already exists.
//  System.IO.File.Copy(sourceFile, destFile, true);

// To copy all the files in one directory to another directory.
// Get the files in the source folder. (To recursively iterate through
// all subfolders under the current directory, see
// "How to: Iterate Through a Directory Tree.")
// Note: Check for target path was performed previously
//       in this code example.
if (System.IO.Directory.Exists(sourcePath))
{
    string[] files = System.IO.Directory.GetFiles(sourcePath);

    // Copy the files and overwrite destination files if they already exist.
    foreach (string s in files)
    {
        // Use static Path methods to extract only the file name from the path.
        //fileName = System.IO.Path.GetFileName(s);
        destFile = System.IO.Path.Combine(targetPath);
        System.IO.File.Copy(s, destFile, true);
    }
}
else
{
    Console.WriteLine("Source path does not exist!");
}

// Keep console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();

Upvotes: 0

Views: 1611

Answers (3)

Filip Cordas
Filip Cordas

Reputation: 2561

To keep the Directory structure

foreach (var dir in System.IO.Directory.GetDirectories(sourcePath))
            {
                var dirInfo = new System.IO.DirectoryInfo(dir);
                System.IO.Directory.CreateDirectory(System.IO.Path.Combine(targetPath, dirInfo.Name));
                foreach (var file in System.IO.Directory.GetFiles(dir))
                {
                    var fileInfo = new System.IO.FileInfo(file);
                    fileInfo.CopyTo(System.IO.Path.Combine(targetPath, dirInfo.Name, fileInfo.Name));
                }
            };

Upvotes: 0

Chris Schmitz
Chris Schmitz

Reputation: 390

The following line cannot work like provided:

destFile = System.IO.Path.Combine(targetPath);

File.Copy expects a path to a file where you want to copy the content from "s", but you are providing only the destination folder. You have to include a filename in the Path.Combine method.

If you parse the path strings with the Path.GetFileName method for example, you can pass the result (only the filename without full source path) as an additional argument to Path.Combine to generate a valid destination path.

Additionally, like uteist already said, you have to get all subdirectories first, because in your code example, you're only copying the files, directly placed under your root source folder.

Upvotes: 0

uTeisT
uTeisT

Reputation: 2266

Alright, here we go:

This doesn't really makes sense. If targetPath exists, create targetPath folder?

if (System.IO.Directory.Exists(targetPath))
{
    System.IO.Directory.CreateDirectory(targetPath);
}

You probably meant:

if (!System.IO.Directory.Exists(targetPath))
{
    System.IO.Directory.CreateDirectory(targetPath);
}

What you need to do first is, getting all directories to begin with:

var allDirectories = Directory.GetDirectories(targetPath, "*", SearchOption.AllDirectories);

then you can loop through allDirectories with foreach, find all files in each folder and copy the contents.

Upvotes: 2

Related Questions