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