【问题标题】:FileStream not reading FileName input from external classFileStream 未从外部类读取 FileName 输入
【发布时间】:2013-06-14 02:57:49
【问题描述】:

我正在尝试制作一个字节写入器。到目前为止,在继续编写编写器之前,我已经让程序编写文件头作为一般测试。问题是,我通过coreFormcoreSaveFileDialog选择了一个文件后,一行

var fs = new FileStream(classCoreForm.CoreSaveFileDialog.FileName, FileMode.Open, FileAccess.ReadWrite);

在对话框中看不到 FileName,并抛出异常“空路径名不合法”。

这是我的方法的来源:

internal void writeHeader()
    {
        var classCoreForm = new coreForm(); //Creates reference instance for coreForm=
        var fs = new FileStream(classCoreForm.coreSaveFileDialog.FileName, FileMode.Open, FileAccess.ReadWrite);
        /*
         * Writes file header via fs.WriteByte . . .
         */
    }

writeHeader 正在从名为 saveScript 的初步函数中调用。这是它的来源。

internal void saveScript()
    {
        var classCoreForm = new coreForm(); //Creates reference instance for coreForm
        if (fileAlreadySaved == false)
        {
            classCoreForm.coreSaveFileDialog.ShowDialog(); //Shows save file dialog
            if (classCoreForm.coreSaveFileDialog.FileName != "")
            {
                writeHeader();
            }
            else
            {

            }
        }
    }

我做错了什么?我是否在 SaveFileDialog 的属性中错误地设置了某些内容,还是上面代码中的某些内容?

【问题讨论】:

  • 你有没有在new FileStream(...)的行上放一个断点,看看Filename属性返回什么?
  • 这是调试器的停止点。通过在调试期间要暂停执行的行上按 F9 在 Visual Studio 中切换一个。按 F5 开始调试。当执行到达断点时,代码将在该行暂停,您可以检查程序状态。然后,您可以向前运行 (F5) 或跳过/进入函数调用(F10 / F11 但我不确定,我有自定义设置)。
  • 等等,我在本地窗口中看到FileName 属性为空。等一下,让我编辑我的帖子。
  • ShowDialog() 函数的返回值是多少?如果不是DialogResult.Ok,您将不会收到返回给您的文件名。另外,您要打开什么文件? Windows 资源管理器中的某些文件夹实际上是虚拟文件夹,可能不会在文件系统中返回文件名。在这种情况下,您可能会得到 null。

标签: c# .net file hex


【解决方案1】:

saveScript() 调用 writeHeader,但它没有向 writeHeader 传递任何内容。然后,您将创建一个全新的“coreForm”实例,该实例与您在 saveScript 方法中创建的实例是分开的。

更改 writeHeader 以接受文件名作为参数:

internal void writeHeader(string fileName)
{
    //var classCoreForm = new coreForm(); //Creates reference instance for coreForm=
    var fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite);
    /*
     * Writes file header via fs.WriteByte . . .
     */
}

然后,在您的 saveScript() 方法中,更改 writeHeader();到

writeHeader(classCoreForm.coreSaveFileDialog.FileName);

如果您在 saveScript 中出于其他原因需要 coreForm,您可能希望通过引用传递 coreForm,或者将您可能需要的其他变量传递到 saveScript。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2012-03-08
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多