Vb.net SaveFileDialog.OpenFile()索引自动失效异常

Vb.net SaveFileDialog.OpenFile()索引自动失效异常,vb.net,indexoutofboundsexception,savefiledialog,Vb.net,Indexoutofboundsexception,Savefiledialog,我最近写了一些与菜单条相关的代码,其中有一个选项包含OpenFile、SaveFile和Exit等。下面是代码 Dim myStream As Stream Dim saveFileDialog1 As New SaveFileDialog() saveFileDialog1.Filter = "ebd files (*.txt)|*.txt" saveFileDialog1.FilterIndex = 2 saveFileDialog1.RestoreDirector

我最近写了一些与菜单条相关的代码,其中有一个选项包含OpenFile、SaveFile和Exit等。下面是代码

Dim myStream As Stream
Dim saveFileDialog1 As New SaveFileDialog()

    saveFileDialog1.Filter = "ebd files (*.txt)|*.txt"
    saveFileDialog1.FilterIndex = 2
    saveFileDialog1.RestoreDirectory = True
    If saveFileDialog1.ShowDialog() = DialogResult.OK Then
        Try
            myStream = saveFileDialog1.OpenFile()
            If (myStream IsNot Nothing) Then
                ' Code to write the stream goes here.
                Dim sw As New StreamWriter(myStream)

                sw.Flush()
                sw.Close()

                myStream.Close()
             End If
         Catch Ex As Exception
             MessageBox.Show("Can't save file on disk: " & Ex.Message)
         End Try
    End If
另一段代码完全相同,但没有If语句,如下所示

Dim myStream As Stream
Dim saveFileDialog1 As New SaveFileDialog()

    saveFileDialog1.Filter = "ebd files (*.txt)|*.txt"
    saveFileDialog1.FilterIndex = 2
    saveFileDialog1.RestoreDirectory = True

    Try
        myStream = saveFileDialog1.OpenFile()
        If (myStream IsNot Nothing) Then
            ' Code to write the stream goes here.
            Dim sw As New StreamWriter(myStream)
            'some sw.WriteLine code here...            
            sw.Flush()
            sw.Close()

            myStream.Close()
         End If
     Catch Ex As Exception
         MessageBox.Show("Can't save file on disk: " & Ex.Message)
     End Try

我遇到的问题是第二段代码,当它运行时,系统将抛出索引超出范围异常,如何在不使用If语句的情况下修复它?是否有任何方法可以显示对话框窗口?有人能告诉我关于这个索引错误消息的线索吗?谢谢

查看OpenFile的源代码可以发现可能的错误点

public Stream OpenFile()
{
    IntSecurity.FileDialogSaveFile.Demand();
    string str = base.FileNamesInternal[0];
    if (string.IsNullOrEmpty(str))
    {
        throw new ArgumentNullException("FileName");
    }
    Stream stream = null;
    new FileIOPermission(FileIOPermissionAccess.AllAccess, IntSecurity.UnsafeGetFullPath(str)).Assert();
    try
    {
        stream = new FileStream(str, FileMode.Create, FileAccess.ReadWrite);
    }
    finally
    {
        CodeAccessPermission.RevertAssert();
    }
    return stream;
}
代码似乎试图获取
base.FileNamesInternal[0]但如果不显示对话框或选择文件名来保存此内部数组,则该数组可能为空

我试图读取属性文件名中索引为0的项,但得到了相同的错误

string file = saveFileDialog1.FileNames(0)  ' Index out of range....

我想听听我们WinForms更有经验的海报,如果这真的是看起来的那样,我想我对您试图实现的目标有点困惑

在第二个示例中,似乎从未“显示对话框”,即saveFileDialog1.ShowDialog()

因此,用户无法选择文件/路径

然后尝试使用尚未设置的文件/路径

如果您只需要打开任意文件进行写入,而不向用户显示对话框,为什么不使用file.open()或其他方法呢


异常很可能是在我们看不到的代码中抛出的。您需要发布异常的堆栈跟踪。