C# WinForms - Ошибка в OpenFileDialog MultiSelect: "Индекс находился за пределами массива".

В режиме отладки во время работы приложения C# WinFOrms, после выбора файлов через 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)
    {

    }

Спасибо!

1 ответ

Решение

То, что вы делаете, кажется, не имеет большого смысла. Что должна делать следующая строка?

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 - полный путь, поэтому добавление его к временному пути приведет к неверному пути. Также рассмотрите возможность использования Path.Combine объединить два пути:

Path.Combine(tempFolder, Path.GetFileName(FileName))
Другие вопросы по тегам