4

我一直在使用以下几行来搜索特定文件类型的文件夹结构,然后复制这些文件类型并保持其原始文件夹结构。它工作得很好。我可以对我的方法进行任何修改以仅复制包含过滤文件类型的目录吗?

*edit:我可以让用户使用名为 txtFilter 的文本框,只选择一组文件(例如 *.dwg 或 *.pdf)。

private void button1_Click(object sender, EventArgs e)
{
    string sourceFolder = txtSource.Text;
    string destinationFolder = txtDestination.Text;
    CopyFolderContents(sourceFolder, destinationFolder);
}

// Copies the contents of a folder, including subfolders to an other folder, overwriting existing files
public void CopyFolderContents(string sourceFolder, string destinationFolder)
        {
            string filter = txtFilter.Text;

            if (Directory.Exists(sourceFolder))
            {
                // Copy folder structure
                foreach (string sourceSubFolder in Directory.GetDirectories(sourceFolder, "*", SearchOption.AllDirectories))
                {
                    Directory.CreateDirectory(sourceSubFolder.Replace(sourceFolder, destinationFolder));
                }

                // Copy files
                foreach (string sourceFile in Directory.GetFiles(sourceFolder, filter, SearchOption.AllDirectories))
                {
                    string destinationFile = sourceFile.Replace(sourceFolder, destinationFolder);
                    File.Copy(sourceFile, destinationFile, true);
                }
            }
        }
4

3 回答 3

1

在你的主循环中有这样的东西吗?

if (Directory.EnumerateFiles(sourceSubFolder, "*.pdf").Any())
       Directory.CreateDirectory(sourceSubFolder.Replace(sourceFolder, destinationFolder));

或对于多种文件类型:

if (Directory.EnumerateFiles(sourceSubFolder).Where(x => x.ToLower.EndsWith(".pdf") || x.ToLower.EndsWith(".dwg")).Any())
       Directory.CreateDirectory(sourceSubFolder.Replace(sourceFolder, destinationFolder));
于 2012-11-19T01:53:02.210 回答
0

您可以简单地将两个操作连接到一个循环中并在 O(n) 中完成算法。

foreach(string sourceFile in Directory.GetFiles(sourceFolder, filter, SearchOption.AllDirectories))
{
    Directory.CreateDirectory(Path.GetDirectoryName(sourceFile.Replace(sourceFolder,destinationFolder)));
    File.Copy(sourceFile,sourceFile.Replace(sourceFolder,destinationFolder),true);
}
于 2012-11-19T02:33:00.583 回答
0

您可以从找到的文件中获取不同的目录,然后遍历它们并在复制文件之前创建目录。

        if (Directory.Exists(sourceFolder))
        {
            var files = Directory.GetFiles(sourceFolder, filter, SearchOption.AllDirectories);

            foreach(string directory in files.Select(f => Path.GetDirectoryName(f)).Distinct())
            {
                string destinationDirectory = directory.Replace(sourceFolder, destinationFolder);

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

            foreach (string sourceFile in files)
            {
                string destinationFile = sourceFile.Replace(sourceFolder, destinationFolder);
                File.Copy(sourceFile, destinationFile, true);
            }
        }
于 2012-11-19T02:50:47.170 回答