循环通过目录中的子目录

我有一个目录“文件夹”与这个目录内的许多子目录。 每个子目录里面都有很多图片。 我想遍历“文件夹”目录中的子目录,然后遍历每个目录中的所有图像,将图像导出到Excel中,并将每个子目录中的图像导出到一个Excel工作表中。

例如,如果我有十个子目录,我应该有一个Excel工作簿与十个Excel工作表,然后在每个Excel工作表中将有来自每个子目录的图像。

这是我已经尝试,但图像只出现在Worksheet1而不是所有的工作表:

public void ExportToExcel() { //for export ExcelPackage objExcelPackage = new ExcelPackage(); //create new workbook string[] filesindirectory = Directory.GetDirectories(Server.MapPath("~/Folder")); int count = 0; int count1 = 0; int x = 25; int finalValue = 0; foreach (string subdir in filesindirectory) { count++; ExcelWorksheet ws = objExcelPackage.Workbook.Worksheets.Add("Worksheet" + count); //create new worksheet foreach (string img in Directory.GetFiles(subdir)) { count1++; System.Web.UI.WebControls.Image TEST_IMAGE = new System.Web.UI.WebControls.Image(); System.Drawing.Image myImage = System.Drawing.Image.FromFile(img); var pic = ws.Drawings.AddPicture(count1.ToString(), myImage); // Row, RowoffsetPixel, Column, ColumnOffSetPixel if (count1 > 1) { pic.SetPosition(finalValue, 0, 2, 0); finalValue += (x + 1); // Add 1 to have 1 row of empty row } else { pic.SetPosition(count1, 0, 2, 0); finalValue = (count1 + x) + 1; // Add 1 to have 1 row of empty } } } var filepath = new FileInfo(@"C:\Users\user\Desktop\Test\" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx"); objExcelPackage.SaveAs(filepath); } 

如何遍历目录中的每个子目录,然后循环使用C#从每个子目录中的所有图像?

Janne Matikainen的答案是正确的,但你需要知道如何修改你的代码…

首先改变你的代码这一行

  string[] filesindirectory = Directory.GetFiles(Server.MapPath("~/Folder")); 

  string[] filesindirectory = Directory.GetDirectories(Server.MapPath("~/Folder")); 

其次,你需要在你的子文件夹path中search文件

 foreach (string subdir in filesindirectory) 

subdir是你的目录的path。

只要做相同的事情你做什么来获取文件

 foreach (string img in Directory.GetFiles(subdir)) 

在完成foreach子目录之后

 foreach (string img in Directory.GetFiles(subdir)) { // Your Code } // Reset the Count1 count1 = 0; 

重置它,因为您正在增加每个工作表的dynamic行生成。
然后你在新的工作表,你没有重置它。
它将按照前面的表格继续计数。

要获取文件夹名称,您可以通过拆分轻松获取。
在创build工作表之前,请按照以下步骤进行操作。

 string[] splitter = subdir.Split('\\'); string folderName = splitter[splitter.Length - 1]; 

注意如果folderName包含一些符号,它可能无法将其设置为Excel工作表,并且名称不能太长。
请确保您replace为Excel工作表的可支持符号

这应该列出从C:\ Images开始的所有文件,并遍历所有的子目录及其子目录。

 public void ExportToExcel() { //for export var objExcelPackage = new ExcelPackage(); //create new workbook this.ListFiles(objExcelPackage, 0, Server.MapPath("~/Folder")); var filepath = new FileInfo(@"C:\Users\user\Desktop\Test\" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx"); objExcelPackage.SaveAs(filepath); } public void ListFiles(ExcelPackage objExcelPackage, int worksheetIndex, string path) { var imageCount = 0; var x = 25; var finalValue = 0; var files = Directory.GetFiles(path).Select(s => new FileInfo(s)); if (files.Any()) { //create new worksheet var ws = objExcelPackage.Workbook.Worksheets.Add("Worksheet" + (++worksheetIndex)); foreach (var file in files) { imageCount++; var TEST_IMAGE = new System.Web.UI.WebControls.Image(); var myImage = System.Drawing.Image.FromFile(img); var pic = ws.Drawings.AddPicture(imageCount.ToString(), myImage); // Row, RowoffsetPixel, Column, ColumnOffSetPixel if (imageCount > 1) { pic.SetPosition(finalValue, 0, 2, 0); finalValue += (x + 1); // Add 1 to have 1 row of empty row } else { pic.SetPosition(imageCount, 0, 2, 0); finalValue = (imageCount + x) + 1; // Add 1 to have 1 row of empty } } } foreach (var dir in Directory.GetDirectories(path)) { this.ListFiles(objExcelPackage, worksheetIndex, dir); } } 

Directory.GetFiles(dir)返回dir中的所有文件,没有文件夹的话你应该使用Directory.EnumerateDirectories(dir)

 using System; using System.Collections.Generic; using System.IO; using System.Linq; class Program { private static void Main(string[] args) { try { string dirPath = @"\\archives\2009\reports"; List<string> dirs = new List<string>(Directory.EnumerateDirectories(dirPath)); foreach (var dir in dirs) { Console.WriteLine("{0}", dir.Substring(dir.LastIndexOf("\\") + 1)); } Console.WriteLine("{0} directories found.", dirs.Count); } catch (UnauthorizedAccessException UAEx) { Console.WriteLine(UAEx.Message); } catch (PathTooLongException PathEx) { Console.WriteLine(PathEx.Message); } } } 

复合模式适合你的问题在这里。

 public interface IExcelWorksheetAdapter { //todo: implement this method, here you have everything you need for an image file void AddPicture(FileSystemItem aFile); } public class FileSystemItem { public virtual string FullPath { get; protected set; } public virtual int Level { get; set; } public virtual string Name { get { if (string.IsNullOrWhiteSpace(FullPath)) return string.Empty; return FullPath.Split('\\').Last(); } } public virtual void Operation(IExcelWorksheetAdapter ws) { } } public class FolderItem : FileSystemItem { public FolderItem(string fullPath) { Items = new List<FileSystemItem>(); if (!Directory.Exists(fullPath)) return; FullPath = fullPath; var files = Directory.GetFiles(FullPath).Select(p => new FileItem(p) { Level = this.Level + 1 }).ToList(); Items.AddRange(files); var subFolders = Directory.GetDirectories(fullPath).Select(p => new FolderItem(p) {Level = this.Level + 1}).ToList(); Items.AddRange(subFolders); } public List<FileSystemItem> Items { get; set; } public override void Operation(IExcelWorksheetAdapter ws) { Items.ForEach(x => x.Operation(ws)); } } public class FileItem : FileSystemItem { public FileItem(string path) { if (File.Exists(path)) { FullPath = path; } } public override void Operation(IExcelWorksheetAdapter ws) { ws.AddPicture(this); } } [TestFixture] public class DirectoryCompositeTest { [Test] public void Operation_for_a_directory_files() { var directory = new FolderItem(AppDomain.CurrentDomain.BaseDirectory); directory.Operation(new Sample()); // give your IExcelWorksheetAdapter implementation here. } } public class Sample : IExcelWorksheetAdapter { public void AddPicture(FileSystemItem aFile) { Console.WriteLine(Indent(aFile.Level) + aFile.Name); } private string Indent(int level) { string result = ""; for (int i = 0; i < level; i++) { result += "-"; } return result; } } 
Interesting Posts