我编写了以下代码来存储字符串数组中的文件名:
string[] fileStore;
private void button1_Click(object sender, EventArgs e)
{
DirectoryInfo dir1 = new DirectoryInfo(@"D:\data\");
FileInfo[] files = dir1.GetFiles("*.txt", SearchOption.AllDirectories);
foreach (FileInfo f in files)
{
int a = 0;
string ss;
ss = f.Name;
try
{
fileStore[a] = ss.ToString();
a++;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
但是这段代码给出了以下异常:
对象引用未设置为对象的实例。
答案 0 :(得分:4)
filestore
为空。您可以使用filestore = new string[files.Length]
初始化它。
我个人将foreach
循环替换为filestore = files.Select(f => f.Name).ToArray()
。
您的try...catch
也是荒谬的。除非你的程序有错误,否则try
部分不应该有例外。如果你想要try...catch
它应该在文件枚举周围,它应该只捕获一些IO相关的异常,而不是System.Exception
。
答案 1 :(得分:1)
在声明数组string[]
时,您需要在分配数据之前知道确切的大小:
fileStore = filestore = new string[files.Length];
但也许您可以将string[]
替换为System.Collections.Generic.List<string>
,这不需要您提前知道数组的大小:
List<string> fileStore = null;
// In function:
if( fileStore == null){
fileStore = new List<string>();
} else {
fileStore.Clear(); // Optionally remove elements collected so far
}
foreach (FileInfo f in files) {
fileStore.add( f.Name.ToString());
}
// And you always can export list to array:
string filesStoreArray[] = fileStore.ToArray();