2013-04-21 89 views
-1

我写了下面的代码保存在字符串数组文件名:存储文件名称中的字符串数组

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

但是这个代码给出了以下异常:未设置为一个实例

对象引用的一个对象。

+1

错误还指出,在特定线路PS:'ss'已经是一个字符串,没有理由骂'的ToString()' – zerkms 2013-04-21 11:19:52

+0

那么你是如何尝试解决这个问题呢? – usr 2013-04-21 11:19:59

+2

filestore是'null'。 – CodesInChaos 2013-04-21 11:20:23

回答

4

filestore为空。您可以通过filestore = new string[files.Length]进行初始化。

个人而言,我会通过filestore = files.Select(f => f.Name).ToArray()更换你的整个foreach循环。

try...catch也是荒谬的。在try部分中绝不应该有例外,除非您的程序有错误。如果你想要一个try...catch它应该在文件枚举周围,它应该只捕获几个IO相关的异常,而不是System.Exception

1

在声明数组string[]你必须知道与分配数据之前的确切大小:

fileStore = filestore = new string[files.Length]; 

但也许你可以用System.Collections.Generic.List<string>取代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(); 
相关问题