另存为使用提供的文件名,但稍后在代码中更改为 null - 这导致文件永远不会被创建
Posted
技术标签:
【中文标题】另存为使用提供的文件名,但稍后在代码中更改为 null - 这导致文件永远不会被创建【英文标题】:Save as is taking the filename provided, but is changing to null later in the code - which is causing the file never to be created 【发布时间】:2012-11-21 15:40:15 【问题描述】:所以,我上次有一个关于语法的问题,现在语法错误已修复,我有一个问题,即使我的教授看过之后,他也不知道如何解决。我们逐行浏览了我的代码,并通过初始的另存为对话框,一切看起来都很好,并且文件名/路径显示在调试器中。它传递到创建文件行,然后传递到我必须添加以使我的语法正常工作的代码 - 然后继续到我试图打开文件的位置,以便能够使用带有我的随机数的 writeline 命令生成器 - 而不是打开适当的文件,它变成“空”作为一个值!但它并没有就此停止,它继续到随机数生成器,并滚动所需数量的随机数,但当然,由于开始值显示为“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();
我只包括了相关的部分——我确实有一点点,但那只是用于退出/清除按钮,调试器根本不会跳转到它们,所以我剪掉了多余的部分。
【问题讨论】:
您正在尝试写入文件,即使用户说不这样做。当您打印“您选择不保存数据”时,您应该从该方法返回... 【参考方案1】:您将openFileDialog1.Filename
与File.CreateText
一起使用,但在上面您使用saveFileDialog1
【讨论】:
另外,打你的教授的脸,因为他显然不明白范围的重要性。如果编写得当,您可以避免这种情况。 是的,说真的,如果教授逐行通过调试器看不到这个,我会感到害怕...... 马里奥,想想自己被喜悦的尖叫所拥抱。有用!谢谢! @HeatherT 看看我的答案,以及您目前设置方法的方式遇到问题。尝试取消保存文件对话框,你的程序仍然会尝试将随机数写入一个不好的文本文件【参考方案2】:对我来说,您的 while 数字循环位于保存文件对话框的 if else 逻辑之外,这对我来说毫无意义。如果他们没有选择文件,那么您为什么还要尝试将随机数写入文件?在 if 语句中移动 while 循环。
此外,正如马里奥指出的那样,您在 2 个不同的对话框中使用了不匹配的文件名,因此这是问题的根本问题,但我建议您同时修复这两个问题以避免将来出现问题。
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.");
【讨论】:
虽然您解决了一个有效问题,但不建议使用大的if
正文,并且不会解决最初的问题。
我意识到我的回答并没有解决问题的根本问题并解决了这个问题。但是,将 while 循环添加到检查有效保存文件的 if 肯定不会创建“大” if 块,更不用说这里的逻辑需要它。如果他通过了用户没有选择保存文件的 else ,他仍在尝试将随机数写入文本文件!
这可以通过制作else
return
来解决。任何大于一行的if
块都可以被认为是大的。
虽然这可能是一个偏好问题,但我认为 else 语句中的随机返回会阻止进一步的代码执行是非常糟糕的形式,我认为这里的很多人都会同意我的观点。
我认为您指的是单进单出,这在 60 年代确实被认为是一件好事。今天它更像是快速失败。大if
块不仅仅是风格问题,它们是等待发生的意外。如果还有其他条件呢?嵌套另一个 if
?以上是关于另存为使用提供的文件名,但稍后在代码中更改为 null - 这导致文件永远不会被创建的主要内容,如果未能解决你的问题,请参考以下文章