Using the Directory class, check directories for specific file types

I used the following lines to search for the folder structure for specific file types and simply copied these file types and saved their original folder structure. It works very well. Is there any modification that I can do for my method, only to copy directories containing a filtered file type?

* edit: I can let the user select only a specific set of files (example * .dwg or * .pdf) using a text field named txtFilter.

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
source share
3 answers

Something like this in your main loop?

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

or for several file types:

 if (Directory.EnumerateFiles(sourceSubFolder).Where(x => x.ToLower.EndsWith(".pdf") || x.ToLower.EndsWith(".dwg")).Any()) Directory.CreateDirectory(sourceSubFolder.Replace(sourceFolder, destinationFolder)); 
+1
source

You can simply combine both operations in one cycle and complete the algorithm in 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); } 
0
source

You can get various directories from the files you find, then iterate over them and create directories before copying the files.

  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); } } 
0
source

Source: https://habr.com/ru/post/1446846/


All Articles