c# - C#WinForms-OpenFileDialog MultiSelect : “Index was outside the bounds of the array.” 上的错误

标签 c# winforms debugging compiler-errors openfiledialog

在 Debug模式下,运行C#WinFOrms App时,通过OpenFileDialog选择文件后,

       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)
    {

    }

谢谢!

最佳答案

您正在做的事情似乎没有多大意义。以下几行应该做什么?

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属性的Length为0,因此尝试访问其中的任何项目都会导致异常。

更新:
还有一个问题:
FileName是完整路径,因此将其附加到temp路径将导致无效路径。另外,请考虑使用Path.Combine组合两个路径:
Path.Combine(tempFolder, Path.GetFileName(FileName))

关于c# - C#WinForms-OpenFileDialog MultiSelect : “Index was outside the bounds of the array.” 上的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5489121/

相关文章:

c# - 广播 ping 是如何工作的?

c# - 从枚举标志转换 CSV,反之亦然

winforms - 使用 winforms 和 Managed C++ 浏览文件对话框

python - python - 从另一个线程启动后将systrace处理程序添加到python线程的方法?

java - 调试时如何处理 ClassNotLoadedException?

c# - 当绑定(bind)属性声明为接口(interface)类型与类类型时,WPF 绑定(bind)行为不同?

c# - Wpf 按标签和类型查找所有控件

c# - Listview 选中的项目颜色变为灰色

c# - 如何防范 NHibernate 不完整映射

c - 如何使用 gdb 调试 "Abort trap: 6"错误