循环遍历目录中的子目录

时间:2015-10-23 06:45:01

标签: c# asp.net excel directory subdirectory

我有一个目录'Folder',在这个目录中有很多子目录。在每个子目录中都有很多图像。我想循环遍历“Folder”目录中的子目录,然后循环遍历每个目录中的所有图像,将图像导出到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#循环遍历每个子目录中的所有图像?

4 个答案:

答案 0 :(得分:8)

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

首先在此行更改您的代码

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

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

其次,您需要在子文件夹路径中搜索文件

foreach (string subdir in filesindirectory)

subdir 是您目录的路径。

回答你为获取文件所做的相同的事情

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

完成foreach子目录后

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

重置它,因为每个工作表的动态行生成都在增加 然后你在新表,你没有重置它。
它将按照前一张表继续计算。

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

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

记下如果 folderName 包含某些符号,则可能无法将其设置为Excel工作表,且名称也不能太长。
请确保替换为excel工作表的可支持符号

答案 1 :(得分:4)

这应列出从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);
    }
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

The Composite Pattern符合您的问题。

@objc protocol MyProtocol : NSObjectProtocol {
    func method()
}


class MyClass : MulticastDelegateContainer {
    typealias DelegateType = MyProtocol
    var multicastDelegate = [MyProtocol]()

    func testDelegates() {
        invokeDelegate { $0.method() }
    }
}