C# “另存为”采用提供的文件名,但稍后在代码中会更改为null,这将导致永远无法创建该文件

C# “另存为”采用提供的文件名,但稍后在代码中会更改为null,这将导致永远无法创建该文件,c#,logic,save-as,C#,Logic,Save As,所以,上次我有一个关于语法的问题,现在语法错误已经纠正了,我有一个问题,即使我的教授看了一遍,他也不知道如何纠正。我们逐行检查了我的代码,使用初始的“另存为”对话框,一切看起来都很好,文件名/路径显示在调试器中。它传递到create file行,然后是我必须添加的代码,以使我的语法正常工作-然后它继续到我试图打开文件的地方,以便能够使用writeline命令和我的随机数生成器-在那里,它不是打开相应的文件,而是作为一个值变为“null”!但它并没有就此停止,它继续到随机数生成器,并滚动所需数量的

所以,上次我有一个关于语法的问题,现在语法错误已经纠正了,我有一个问题,即使我的教授看了一遍,他也不知道如何纠正。我们逐行检查了我的代码,使用初始的“另存为”对话框,一切看起来都很好,文件名/路径显示在调试器中。它传递到create file行,然后是我必须添加的代码,以使我的语法正常工作-然后它继续到我试图打开文件的地方,以便能够使用writeline命令和我的随机数生成器-在那里,它不是打开相应的文件,而是作为一个值变为“null”!但它并没有就此停止,它继续到随机数生成器,并滚动所需数量的随机数,但当然,由于开始值显示为“null”,它不会像预期的那样保存到文件中。哦,我的教科书中的代码是产生第一个语法错误的代码,但没有提供修复它的方法。这是代码,如果很长/很难阅读,请原谅

using System.IO; // Added to be able to use StreamWriter variable type

namespace Random_Number_File_Writer
{
public partial class Form1 : Form
{ 
    StreamWriter randomNumberFile; //Name streamwriter
    decimal numbers; //Variable to insert the number up down value into
    Random rand1 = new Random(); //Random number generator
    int writeitem; // Variable to insert random number into, to write.

    public Form1()
    {

        InitializeComponent();
    }
    public void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
    {
    }

    private void generateButton_Click(object sender, EventArgs e)
    {
        try
        {
            //Initial opening point for save file dialogue
            saveFileDialog1.InitialDirectory = @"C:\Users\Heather\Documents\Visual Studio 2010\Projects\Random Number File Writer";
            //Save As popup - Opening the file for writing usage once it's created.
            if(saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                randomNumberFile = File.CreateText(openFileDialog1.FileName);
            }
            else // Popup informing user that the data will not save to a file because they didn't save.
            {
                MessageBox.Show("You elected not to save your data.");
            }

            numbers = numericUpDown1.Value; //Gathering the number of numbers to generate from the number box.

            while (numbers > 0) // Loop counting down to 0 to give the user the appropriate number of requested random numbers.
            {

                writeitem = rand1.Next(101); // Random number generated.
                randomNumberFile.WriteLine(writeitem); //Random number written to file
                numbers--; // Initial number for user input decremented so that loop will have an ending and user only gets the amount of randoms asked for.
            }
            randomNumberFile.Close();
        }

我只包括了一些相关的部分-我确实有一点事后诸葛亮,但这只是为了退出/清除按钮,调试器根本不会跳转到它们,所以我删掉了多余的部分。

对于我来说,数字的while循环位于保存文件对话框的if-else逻辑之外是没有意义的。如果他们没有选择一个文件,那么你为什么还要尝试将随机数写入一个文件?在if语句中移动while循环

正如Mario指出的,您正在使用来自两个不同对话框的不匹配文件名,这是问题的根源,但我建议您修复这两个问题,以避免将来的麻烦

try
    {
        //Initial opening point for save file dialogue
        saveFileDialog1.InitialDirectory = @"C:\Users\Heather\Documents\Visual Studio 2010\Projects\Random Number File Writer";
        //Save As popup - Opening the file for writing usage once it's created.
        if(saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            randomNumberFile = File.CreateText(saveFileDialog1.FileName);
            numbers = numericUpDown1.Value; //Gathering the number of numbers to generate from the number box.
            while (numbers > 0) // Loop counting down to 0 to give the user the appropriate number of requested random numbers.
            {
                writeitem = rand1.Next(101); // Random number generated.
                randomNumberFile.WriteLine(writeitem); //Random number written to file
                numbers--; // Initial number for user input decremented so that loop will have an ending and user only gets the amount of randoms asked for.
                randomNumberFile.Close();
            }
        }
        else // Popup informing user that the data will not save to a file because they didn't save.
        {
            MessageBox.Show("You elected not to save your data.");
        }
    }

对于我来说,数字的while循环位于save file对话框的if-else逻辑之外是毫无意义的。如果他们没有选择一个文件,那么你为什么还要尝试将随机数写入一个文件?在if语句中移动while循环

正如Mario指出的,您正在使用来自两个不同对话框的不匹配文件名,这是问题的根源,但我建议您修复这两个问题,以避免将来的麻烦

try
    {
        //Initial opening point for save file dialogue
        saveFileDialog1.InitialDirectory = @"C:\Users\Heather\Documents\Visual Studio 2010\Projects\Random Number File Writer";
        //Save As popup - Opening the file for writing usage once it's created.
        if(saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            randomNumberFile = File.CreateText(saveFileDialog1.FileName);
            numbers = numericUpDown1.Value; //Gathering the number of numbers to generate from the number box.
            while (numbers > 0) // Loop counting down to 0 to give the user the appropriate number of requested random numbers.
            {
                writeitem = rand1.Next(101); // Random number generated.
                randomNumberFile.WriteLine(writeitem); //Random number written to file
                numbers--; // Initial number for user input decremented so that loop will have an ending and user only gets the amount of randoms asked for.
                randomNumberFile.Close();
            }
        }
        else // Popup informing user that the data will not save to a file because they didn't save.
        {
            MessageBox.Show("You elected not to save your data.");
        }
    }


您正在将
openFileDialog1.Filename
File.CreateText
一起使用,但在上面您使用了
saveFileDialog1
您正在使用
openFileDialog1.Filename
File.CreateText
一起使用
saveFileDialog1

即使用户说不这样做,您也在尝试写入文件。当您打印“您选择不保存数据”时,您应该从该方法返回…您正在尝试写入文件,即使用户说不。当您打印“您选择不保存数据”时,您应该从该方法返回…当您解决一个有效问题时,不建议使用大型
(如果
)实体,也不会解决原始问题。我意识到我的答案并不能解决问题的根本问题,并解决了这个问题。但是,将while循环添加到if中以检查有效的保存文件肯定不会创建“大”if块,更不用说这里的逻辑需要它了。如果他通过了用户没有选择保存文件的else,那么他仍在尝试向文本文件写入随机数!这可以通过使
else
返回来解决。任何<代码>如果块大于一行可以被认为是大的。虽然这可能是一个偏好的问题,但是我认为在另一个语句中有一个随机的返回,阻止其他代码的执行是极坏的形式,我想这里有很多人会同意我的观点。我想你指的是单入口,单出口,这在60年代确实被认为是件好事。今天更像是快速失败。大型
如果
块不仅仅是样式问题,它们是等待发生的意外。如果还有其他情况呢?嵌套另一个
if
?当您解决一个有效的问题时,不建议使用大型
if
实体,也不会解决原始问题。我意识到我的答案并不能解决问题的根本问题,并解决了这个问题。但是,将while循环添加到if中以检查有效的保存文件肯定不会创建“大”if块,更不用说这里的逻辑需要它了。如果他通过了用户没有选择保存文件的else,那么他仍在尝试向文本文件写入随机数!这可以通过使
else
返回来解决。任何<代码>如果块大于一行可以被认为是大的。虽然这可能是一个偏好的问题,但是我认为在另一个语句中有一个随机的返回,阻止其他代码的执行是极坏的形式,我想这里有很多人会同意我的观点。我想你指的是单入口,单出口,这在60年代确实被认为是件好事。今天更像是快速失败。大型
如果
块不仅仅是样式问题,它们是等待发生的意外。如果还有其他情况呢?如果
,再打一个
?同样,打你的教授的脸,因为他显然不理解范围的重要性。你可以避免它,如果它被正确地写了。耶,真的,如果一个教授一行一行地通过一个调试器看不到这一点,我会感到害怕…马里奥,想想你自己被一声尖叫的喜悦所拥抱。它起作用了!谢谢大家!@希瑟特,看看我的答案吧,就像你在自找麻烦一样,你现在的方法是如何建立的。试着取消“保存文件”对话框,你的程序仍然会尝试将随机数写入一个不好的文本文件。另外,打你的教授的脸,因为他显然不理解范围的重要性。如果写得好的话,你本来可以避免的。耶,瑟