如何在C#中从文件夹创建文件名列表

时间:2011-01-25 15:10:36

标签: c#

当我想用文件名填充数组时,我遇到了问题。

代码是:

 string [] arrays= {};
 String sdira= "path of the directory";

 foreach (string d in Directory.GetDirectories(sdira))
 {

   foreach (string f in Directory.GetFiles(d, "*.*"))`enter code here`
   {
     int j = 0;

     array[j++] = path.getfiles(f);
   }

 }

当我遍历数组时,数组中什么都不包含:( 那么如何在这种情况下填充数组? 或任何更好的解决方案:)

6 个答案:

答案 0 :(得分:6)

您在循环的每次迭代开始时将j重置为0.

这个怎么样:

List<string> files = new List<string>();
String sdira = "path of the directory";

foreach (string d in Directory.GetDirectories(sdira)) {

    foreach (string f in Directory.GetFiles(d, "*.*")) {
       files.Add(f);
    }
}

答案 1 :(得分:6)

发布在other question上的解决方案。这消除了完全循环的需要

string [] arrays;
String sdira= "path of the directory";

arrays =  Directory.GetFiles(sdira, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();

也可以

arrays = Directory.GetFiles(sdira, "*", SearchOption.AllDirectories)
    .Where(s => (Path.GetExtension(s).ToLower() == extensionType)).ToArray();

如果您只想说.jpg(似乎在您的其他问题中显示)extensionType =“.jpg”

答案 2 :(得分:2)

在填充数组之前,您需要指定数组的长度。

string[] array = new string[16]; // this will create an arrray of length 16. 

在您的情况下,您需要将数组的长度初始化为目录中的文件数量。

如果您想以递归方式搜索目录,最好使用列表而不是数组。

答案 3 :(得分:1)

您最好使用List<string>,而不是使用数组。在查询所有目录之前,该数组具有固定长度,但您不知道文件数。

var files = new List<string>(); 
string sdira= "path of the directory"; 
foreach (string d in Directory.GetDirectories(sdira)) {   
    files.AddRange(Directory.GetFiles(d, "*.*"));   
}

// To use
foreach(string file in files) { }
string file2 = files[2]; 
// or convert to array
string[] arrays = files.ToArray();

// Or to use as datasource    
comboBox1.DataSource = files;

答案 4 :(得分:1)

鉴于你不知道你正在使用的数组的大小,我认为你使用像List<T>这样的通用集合要好得多,即

 List<string> Filenames = List<string>();
 String sdira= "path of the directory";

 foreach (string d in Directory.GetDirectories(sdira))
 {
   foreach (string f in Directory.GetFiles(d, "*.*"))
   {
       Filenames.Add(f);
   }
 }

答案 5 :(得分:1)

这里有一种鸡肉和鸡蛋的东西,当你创建你的arrays对象时,你需要指定数组的大小。但是,在查看目录之前,您无法执行此操作。在目录列表上运行两次是一个坏主意。

我建议您使用System.Collections.Generic.List对象作为中介,因为这样就无需指定初始字符串数组的大小,然后可以将其转换为字符串数组(实际上您可能不需要)根据您的应用程序对arrays对象的操作,完全执行此操作。例如:

System.Collections.Generic.List<string> filesList = new System.Collections.Generic.List<string>();
string path = @"c:\my\directory\";

foreach (string directory in System.IO.Directory.GetDirectories(path))
{
    foreach (string file in System.IO.Directory.GetFiles(directory))
    {
        filesList.Add(file);
    }
}

string[] filesArray = filesList.ToArray();

编辑:更新了具有防御目录的代码示例,检查并从基本目录中检索文件:

System.Collections.Generic.List<string> filesList = new System.Collections.Generic.List<string>();
string path = @"c:\my\directory\";

if (System.IO.Directory.Exists(path))
{
    //Get files for the base path
    string[] baseDirectoryFiles = System.IO.Directory.GetFiles(path);
    filesList.AddRange(baseDirectoryFiles);

    // Get files in subdirectories (first level) of base path
    foreach (string directory in System.IO.Directory.GetDirectories(path))
    {
        string[] directoryFiles = System.IO.Directory.GetFiles(directory);
        filesList.AddRange(directoryFiles);
    }

    string[] filesArray = filesList.ToArray();
}
else
{
    //Your directory was not found on the filesystem
    //handle as appropriate
}

这将获取基目录和第一级子目录中的所有文件,但它不会从子目录的子目录中获取文件名。为了支持你,你应该看一个递归方法。

修改

以下是一个示例,说明如何递归执行此操作,从而获取所有目录中的所有文件,无论深度如何:

private void MyMethod()
{
    List<string> fileNames = new List<string>();
    GetFileNames(@"C:\my\base\directory", fileNames);
}

private void GetFileNames(string directory, List<string> files)
{
    files.AddRange(System.IO.Directory.GetFiles(directory));

    foreach(string subDirectory in System.IO.Directory.GetDirectories(directory))
    {
        GetFileNames(subDirectory, files);
    }
}