当我想用文件名填充数组时,我遇到了问题。
代码是:
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);
}
}
当我遍历数组时,数组中什么都不包含:( 那么如何在这种情况下填充数组? 或任何更好的解决方案:)
答案 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);
}
}