20

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

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

4

4 回答 4

52

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

//Will create all three directories (if they do not already exist).
System.IO.Directory.CreateDirectory("C:\\First\\Second\\Third")
于 2009-07-18T10:51:32.963 回答
33

为此,我使用以下方法:

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));
于 2009-01-13T08:32:51.690 回答
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);
            }
        }
    }
于 2012-09-06T03:01:47.350 回答
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); 
于 2015-02-18T01:29:20.977 回答