4

MSDNで、あるディレクトリから別のディレクトリにファイルをコピーできるこのソリューションを見つけましたが、サブディレクトリではなくメイン ディレクトリからのみコピーします。

このソリューションを変更して、すべてのフォルダーとその内容もコピーするにはどうすればよいですか?

string StartDirectory = @"C:\Users\...";
string EndDirectory = @"C:\Users\....";

 //Creates all of the directories and sub-directories
foreach (string dirPath in Directory.GetDirectories(StartDirectory, "*", SearchOption.AllDirectories))
    Directory.CreateDirectory(dirPath.Replace(StartDirectory, EndDirectory));

foreach (string filename in Directory.EnumerateFiles(StartDirectory))
{
       using (FileStream SourceStream = File.Open(filename, FileMode.Open))
       {
             using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
             {
                  await SourceStream.CopyToAsync(DestinationStream);
              }
        }
}
4

2 に答える 2

5

最初のループを展開して内側のループを囲むと、機能するはずです。最初の for ループですべてのフォルダーを検索していますが、最上位フォルダー内のファイルのみを列挙しています。各サブフォルダー内のファイルも列挙する必要があります。また、この場合、DirectoryInfo は Directory よりも簡単に操作できます。

DirectoryInfo StartDirectory = new DirectoryInfo(@"C:\Users\...");
DirectoryInfo EndDirectory = new DirectoryInfo(@"C:\Users\....");

//Creates all of the directories and sub-directories
foreach (DirectoryInfo dirInfo in StartDirectory.GetDirectories("*", SearchOption.AllDirectories))
{
    string dirPath = dirInfo.FullName;
    string outputPath = dirPath.Replace(StartDirectory.FullName, EndDirectory.FullName);
    Directory.CreateDirectory(outputPath);

    foreach (FileInfo file in dirInfo.EnumerateFiles())
    {
        using (FileStream SourceStream = file.OpenRead())
        {
            using (FileStream DestinationStream = File.Create(outputPath + file.Name))
            {
                SourceStream.CopyToAsync(DestinationStream);
            }
        }
    }
}
于 2013-04-26T13:22:09.873 に答える
1

1つはすべてのサブディレクトリ(最初)用、もう1つはメインディレクトリ用の2つのループで解決しました:

foreach (string dirPath in Directory.GetDirectories(StartDirectory, "*", SearchOption.AllDirectories))
            {
                Directory.CreateDirectory(dirPath.Replace(StartDirectory, EndDirectory));
                foreach (string filename in Directory.EnumerateFiles(dirPath))
                {
                    using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                    {
                        using (FileStream DestinationStream = File.Create(filename.Replace(StartDirectory, EndDirectory)))
                        {

                            await SourceStream.CopyToAsync(DestinationStream);

                        }
                    }
                }
            }

            foreach (string filename in Directory.EnumerateFiles(StartDirectory))
            {
                using (FileStream SourceStream = File.Open(filename, FileMode.Open))
                {
                    using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
                    {

                        await SourceStream.CopyToAsync(DestinationStream);
                    }
                }
            }
于 2013-04-27T05:53:32.963 に答える