2011-03-30 77 views
0

在調試模式下,在運行C#WinForms應用程序,之後我通過打開文件對話框中選擇文件時,我得到的C#WinForms - OpenFileDialog MultiSelect錯誤:「索引超出了數組的範圍。」

 Error: Could not read file from disk. 
     Original error: Index was outside the bounds of the array. 

你有關於如何解決此錯誤的任何想法?

這裏是我的代碼:

// When the user clicks on Select Files Button, this happens     
    private void sourceFiles_Click(object sender, EventArgs e) 
    { 
     Stream myStream; 
     int i = 0; 
     OpenFileDialog sourceFileOpenFileDialog = new OpenFileDialog(); 

     this.sourceFileOpenFileDialog.InitialDirectory = "i:\\CommissisionReconciliation\\Review\\"; 
     this.sourceFileOpenFileDialog.Filter = "Excel Files (*.xls;*.xlsx;)|*.xls;*.xlsx;|" + "All Files (*.*)|*.*"; 
     this.sourceFileOpenFileDialog.FilterIndex = 2; 
     this.sourceFileOpenFileDialog.RestoreDirectory = true; 
     this.sourceFileOpenFileDialog.Multiselect = true; 
     this.sourceFileOpenFileDialog.Title = "Please Select Excel Source File(s) for Consolidation"; 

     if (this.sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK) 
     { 
      try 
      { 
       string tempFolder = System.IO.Path.GetTempPath(); 

       foreach (string FileName in this.sourceFileOpenFileDialog.FileNames) 
       { 
        this.sourceFileOpenFileDialog.FileNames[i] = FileName; 
        listBoxSourceFiles.Items.Add(FileName); 
        Log("Source Files: " + sourceFileOpenFileDialog.FileNames[i]); 
        i++; 
        System.IO.File.Copy(FileName, tempFolder + @"\" + FileName); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
      } 
     } 

    } 

    //method for the sourcefileOpenFileDialog. Do I need anything here? 
    private void sourceFileOpenFileDialog_FileOk(object sender, CancelEventArgs e) 
    { 

    } 

    //method for the listbox. Do I need anything here? 
    private void listBoxSourceFiles_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    } 

謝謝!

回答

3

你在做什麼似乎沒有多大意義。應該做什麼?

this.sourceFileOpenFileDialog.FileNames[i] = FileName; 

只要改變你的foreach這樣:源於事實

foreach (string FileName in this.sourceFileOpenFileDialog.FileNames) 
{ 
    listBoxSourceFiles.Items.Add(FileName); 
    Log("Source Files: " + FileName); 
    System.IO.File.Copy(FileName, Path.Combine(tempFolder, Path.GetFileName(FileName))); 
} 

的錯誤,你有兩個變量命名sourceFileOpenFileDialog一個是你的類的成員,另一個是在方法中聲明的。 是在方法內聲明的一個只能用在以下行中:

Log("Source Files: " + sourceFileOpenFileDialog.FileNames[i]); 

因爲這種情況下不用於顯示對話框給用戶,其FileNames屬性爲0,因此一個Length嘗試訪問其中的任何項目會導致異常。

更新:
還有更多的一個問題:
FileName是一個完整的路徑,所以其附加到臨時路徑將導致一個無效的路徑。另外,考慮使用Path.Combine來組合兩條路徑:

Path.Combine(tempFolder, Path.GetFileName(FileName)) 
+0

@Daniel,謝謝你的迴應!我改變了代碼,現在得到以下錯誤:「給定路徑的格式不支持。」任何想法如何解決這個問題?在日誌窗口中,對於所選的3個文件,它會顯示「Source Files:System.String []」3次。 – 2011-03-30 16:31:13

+1

@Brian:FileName是一個完整的路徑。只需看一看你的觀察窗口中的'tempFolder + @「\」+ FileName'結果即可。它將類似於「C:\ Windows \ Temp \ C:\ FileSelectedByUser.txt」。 – 2011-03-30 16:32:38

+0

@Brian:更新我的答案,看看。 – 2011-03-30 16:37:40