Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#-用于复制文件路径中的文件夹结构的函数_C#_Filesystems_.net_System.io.directory - Fatal编程技术网

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

c#-用于复制文件路径中的文件夹结构的函数,c#,filesystems,.net,system.io.directory,C#,Filesystems,.net,System.io.directory,我需要一个简单的函数,它将以FileInfo和目标目录名称作为输入,从FileInfo获取文件路径,并将其复制到作为第二个参数传递的目标目录名称中 例如,文件路径为“d:\recordings\location1\client1\job1\file1.ext 如果目标目录不存在,函数应在目标目录名称中创建目录,并在创建目录后复制文件。为此,我使用以下方法: public static void CreateDirectory(DirectoryInfo directory) { if (

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

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

为此,我使用以下方法:

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));

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

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

根据@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);
            }
        }
    }
//
///将源复制到目标。根据需要在目标路径中创建任何必要的文件夹。
/// 
///例如:
///目录示例:
///pSource=C:\somedir\conf和pDest=C:\somedir\backups\USER\u TIMESTAMP\somedir\conf
///源下的所有文件\文件夹都将复制到目标,并将创建两者之间的任何路径。
/// 
///要从中复制的文件或目录的路径
///要复制到的文件或目录的路径
///如果为true,将覆盖pDest中的文件/目录。
公共静态void FileCopyWithReplicate(字符串pSource、字符串pDest、bool pOverwriteDest)
{
字符串destDirectory=Path.GetDirectoryName(pDest);
System.IO.Directory.CreateDirectory(destDirectory);
if(Directory.Exists(pSource))
{
目录副本(pSource、pDest、pOverwriteDest);
}
其他的
{
文件副本(pSource、pDest、pOverwriteDest);
}
}
//来自MSDN Aricle“如何:复制目录”
//链接:http://msdn.microsoft.com/en-us/library/bb762914.aspx
私有静态void DirectoryCopy(字符串sourceDirName、字符串destDirName、bool copySubDirs)
{
DirectoryInfo dir=新的DirectoryInfo(sourceDirName);
DirectoryInfo[]dirs=dir.GetDirectories();
如果(!dir.存在)
{
抛出新的DirectoryNotFoundException(
“源目录不存在或找不到:”
+sourceDirName);
}
如果(!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destdirename);
}
FileInfo[]files=dir.GetFiles();
foreach(文件中的文件信息文件)
{
字符串temppath=Path.Combine(destDirName,file.Name);
CopyTo(temppath,true);
}
如果(复制子文件夹)
{
foreach(目录中的目录信息子目录)
{
字符串temppath=Path.Combine(destdirename,subdir.Name);
目录副本(subdir.FullName、temppath、copySubDirs);
}
}
}

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

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

我们可以为输入文件夹(要复制的结构)创建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); 

我认为,如果你在这方面做得更详细一些,仅仅是一个简单的代码示例和MSDN文档的链接,并删除无关的签准,这将是一个更合理的答案。这似乎很容易理解。为什么需要一个示例。请参阅:无需解释。代码片段是enough、 此外,MSDN还特别声明:“。。它将自动创建路径中不存在的所有文件夹“,@Andy是正确的。我不明白为什么这不是公认的答案,还需要更多的细节吗?得到我的支持票。谢谢你的回答。即使我希望这是我的一个应用,而这是工作解决方案,安迪的答案更方便,所以请考虑接受它,而不是这一个。从字面上说,您不必担心自己创建路径中的所有嵌套文件夹-method System.IO.Directory.CreateDirectory()将尝试在丢失任何部分时自动创建所有文件夹。最简单的方法:请选择,以便它位于顶部,以备将来的访问者使用。目前选择的答案不必要地复杂和误导。