如何在c#中创建与复制文件的源相同的目录

时间:2015-04-15 05:11:25

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我正在将文件从我的server.map路径复制到C:\中的某个文件夹但是当我复制我的文件时,我希望它创建文件夹路径,它与server.map路径中的文件一样复制

这是我的代码,我在复制文件,但它没有创建我想要的相同目录。

  public void CopyFiles()
        {
            string Filename = "PSK_20150318_1143342198885.jpg";
            string sourcePath = Server.MapPath("~/UserFiles/Images/croppedAvatar/");
            string targetPath = @"C:\MyCopyFIle\";

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

        // 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
        {
            Debug.WriteLine("Source path does not exist!");
        }

    }

当我在/userfiles/images/croppedavatar directory中复制源路径时,源路径中包含c:\MyCopyFile我希望它创建一个像c:\MyCopyFile\UserFile\Images\CroppedAvatar

这样的文件夹结构

3 个答案:

答案 0 :(得分:0)

您只需使用FileInfo Class创建文件夹结构:

 string path=@"c:/MyCopyFile/UserFile/Images/CroppedAvatar/";
 FileInfo file = new FileInfo(path);
 file.Directory.Create();

这将创建一个目录,您可以在其中复制您想要的内容。

答案 1 :(得分:0)

您可以更改代码,如下所示

    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)
        {
                Filename = System.IO.Path.GetFileName(s);
                destFile = System.IO.Path.Combine(targetPath, Filename);

                string path = @"C:/MyCopyFile/UserFiles/Images/croppedAvatar/";
                FileInfo file = new FileInfo(path);
                file.Directory.Create();

                string folderStructurePath = @"C:/MyCopyFile/UserFiles/Images/croppedAvatar/" + Filename;
                System.IO.File.Copy(sourceFile, folderStructurePath, true);
        }
    }

答案 2 :(得分:0)

您必须检查每个文件结构并在目标上创建相同的文件,然后将文件复制为

  public void CopyFiles(string srcpath, List<string> sourcefiles, string destpath)
    {


        DirectoryInfo dsourceinfo = new DirectoryInfo(srcpath);
        if (!Directory.Exists(destpath))
        {
            Directory.CreateDirectory(destpath);
        }
        DirectoryInfo dtargetinfo = new DirectoryInfo(destpath);
        List<FileInfo> fileinfo = sourcefiles.Select(s => new FileInfo(s)).ToList();
        foreach (var item in fileinfo)
        {

            string destNewPath = CreateDirectoryStructure(item.Directory.FullName, destpath) + "\\" + item.Name;
             File.Copy(item.FullName, destNewPath);
        }
    }
    public string CreateDirectoryStructure(string newPath, string destPath)
    {
        Queue<string> queue = new Queue<string>(newPath.Split(new string[] { "\\" }, StringSplitOptions.RemoveEmptyEntries));
        queue.Dequeue();
        while (queue.Count>0)
        {
            string dirName = queue.Dequeue();
            if(!new DirectoryInfo(destPath).GetDirectories().Any(a=>a.Name==dirName))
            {
                Directory.CreateDirectory(destPath + "\\" + dirName);
                destPath += "\\" + dirName;
            }
        }
        return destPath;

    }