c# - 用于复制文件路径中的文件夹结构的函数

时间:2009-01-13 08:27:24

标签: c# filesystems .net system.io.directory

我需要一个简单的函数,它将FileInfo和destination_directory_name作为输入,从fileinfo获取文件路径并将其复制到作为第二个参数传递的destination_directory_name中。

代表。 filepath是“d:\ recordings \ location1 \ client1 \ job1 \ file1.ext 如果目录不存在,该函数应在destination_directory_name中创建目录,并在创建目录后复制该文件。

4 个答案:

答案 0 :(得分:48)

System.IO.Directory.CreateDirectory可用于创建最终目录,如果它们不存在,它还会自动创建路径中的所有文件夹。

//Will create all three directories (if they do not already exist).
System.IO.Directory.CreateDirectory("C:\\First\\Second\\Third")

答案 1 :(得分:32)

我正在使用以下方法:

public static void CreateDirectory(DirectoryInfo directory)
{
    if (!directory.Parent.Exists)
        CreateDirectory(directory.Parent);
    directory.Create();
}

以这种方式使用它:

// path is your file path
string directory = Path.GetDirectoryName(path);
CreateDirectory(new DirectoryInfo(directory));

答案 2 :(得分:3)

根据@ NTDLS的答案,这里有一个将源复制到目的地的方法。它处理源是文件或文件夹的情况。功能名称有点臭......如果你想到一个更好的功能,你就会知道。

    /// <summary>
    /// Copies the source to the dest.  Creating any neccessary folders in the destination path as neccessary.
    /// 
    /// For example:
    /// Directory Example:
    /// pSource = C:\somedir\conf and pDest=C:\somedir\backups\USER_TIMESTAMP\somedir\conf   
    /// all files\folders under source will be replicated to destination and any paths in between will be created.
    /// </summary>
    /// <param name="pSource">path to file or directory that you want to copy from</param>
    /// <param name="pDest">path to file or directory that you want to copy to</param>
    /// <param name="pOverwriteDest">if true, files/directories in pDest will be overwritten.</param>
    public static void FileCopyWithReplicate(string pSource, string pDest, bool pOverwriteDest)
    {
        string destDirectory = Path.GetDirectoryName(pDest);
        System.IO.Directory.CreateDirectory(destDirectory);

        if (Directory.Exists(pSource))
        {
            DirectoryCopy(pSource, pDest,pOverwriteDest);
        }
        else
        {
            File.Copy(pSource, pDest, pOverwriteDest);
        }
    }

    // From MSDN Aricle "How to: Copy Directories"
    // Link: http://msdn.microsoft.com/en-us/library/bb762914.aspx
    private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
    {
        DirectoryInfo dir = new DirectoryInfo(sourceDirName);
        DirectoryInfo[] dirs = dir.GetDirectories();

        if (!dir.Exists)
        {
            throw new DirectoryNotFoundException(
                "Source directory does not exist or could not be found: "
                + sourceDirName);
        }

        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
        {
            string temppath = Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, true);
        }

        if (copySubDirs)
        {
            foreach (DirectoryInfo subdir in dirs)
            {
                string temppath = Path.Combine(destDirName, subdir.Name);
                DirectoryCopy(subdir.FullName, temppath, copySubDirs);
            }
        }
    }

答案 3 :(得分:0)

与问题类似,我正在从一个目的地复制文件夹结构并将其复制到另一个目的地。很抱歉发布到旧帖子,但对于最终到此处的人来说可能会有用。

假设我们有一个独立的应用程序,我们需要将文件夹结构从Input文件夹复制到Output文件夹。 Input文件夹和Output文件夹位于我们的应用程序的根目录中。

我们可以为Input文件夹(我们要复制的结构)创建一个DirectoryInfo,如下所示:

DirectoryInfo dirInput = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Input\\");

我们的输出文件夹位置可以存储在字符串中。

string dirOutput = AppDomain.CurrentDomain.BaseDirectory + "\\Output\\";

这种递归方法应该为我们处理其余部分。

    public static void ProcessDirectories(DirectoryInfo dirInput, string dirOutput)
    {
        string dirOutputfix = String.Empty;

        foreach (DirectoryInfo di in dirInput.GetDirectories())
        {
            dirOutputfix = dirOutput + "\\" + di.Name);

            if (!Directory.Exists(dirOutputfix))
            {
                try
                {
                    Directory.CreateDirectory(dirOutputfix);
                }
                catch(Exception e)
                {
                    throw (e);
                }
            }

            ProcessDirectories(di, dirOutputfix);
        }
    }

这个方法也可以很容易地修改来处理文件,但是我设计它时只考虑了我的项目文件夹。

现在我们只使用dirInput和dirOutput调用该方法。

ProcessDirectories(dirInput, dirOutput);