不使用保存文件对话框保存文件

3

我正在继续开展这个项目,但遇到了一个问题。以下是我的需求:

当用户单击“保存”按钮时,将所选记录写入txtFilePath指定的文件中(绝对路径而非相对路径),并处理任何出现的异常,同时不截断当前内部值。

好的,以下是我的代码:

 private void Save_Click(object sender, EventArgs e)
    {

        string filePath = txtFilePath.Text;

        if (!File.Exists(filePath))
        {
            FileStream fs = File.Create(filePath);
            fs.Close();
        }

        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            using (StreamWriter sw = new StreamWriter(fs))
            {
                foreach (string line in employeeList.Items)
                {
                    sw.WriteLine(line);
                }
            }
        }
            }

现在当我打开我的程序并想要保存employeelist.text中的内容时,它并没有被保存到我指定的位置。我不知道是我的代码有问题还是其他原因导致无法保存。以下是一个例子:
我在employeelist中添加了一个人名,并且在文本框中我有一个名为C:\employees\employeelist.txt的文件,我想要将其保存到该文件中。我点击保存按钮,然后去查看employeelist,但发现它并没有被保存。
我不知道自己做错了什么,我已经在网上寻找解决方案,但还没有找到。谢谢。
4个回答

3

需要仔细检查以下几点:

  • 测试时,确保您没有打开employeelist.txt文件
  • 确保您的文件名中没有无效字符
  • 确保您的应用程序有权限将文件保存到指定的位置
  • 使用调试器逐步执行代码,并查找被忽略的异常——一定有一个原因导致该文件未被创建。
  • 检查您的Save_Click事件是否已连接到您的按钮——您的示例代码是否正在运行?

检查完成后,您可能需要根据此示例了解项目的创建 vs. 追加需求:

string path = txtFilePath.Text;

// This text is added only once to the file.
if (!File.Exists(path)) 
{
    using (StreamWriter sw = File.CreateText(path)) 
    {
        foreach (var line in employeeList.Items)
            sw.WriteLine(line.ToString());
    }   
} 
else 
{
    using (StreamWriter sw = File.AppendText(path)) 
    {
        foreach (var line in employeeList.Items)
            sw.WriteLine(line.ToString());
    }
}

这将会创建文件(如果文件不存在),或在文件中追加内容(如果文件已存在)。

看起来你正在解决 @shan 没有的问题。他没有问如何在文件已经存在时进行追加。他的文件根本没有被创建,这就是问题所在。 - Dmytro Shevchenko
@Shedal 他确实要求将内容追加到文件中...“而不截断当前已存在的值”。 - Rudu
@Rudu 但那不是他卡住的问题。那不是他要求我们帮助他的内容。 - Dmytro Shevchenko
是的,我有点着急了。虽然他的逻辑是正确的,但没有理由他的文件不应该被创建。可能有一个异常被忽略了,或者OP不知道如何使用调试器。 - Cᴏʀʏ

1

检查文件是否存在,然后创建它有点多余,因为这可以由StreamWriter/FileStream部分处理。因此,您上面的函数可以简化为以下内容:

public void Save_Click(object sender, EventArgs e)
{
    StreamWriter file = 
      new StreamWriter(txtFilePath.Text, true);//Open and append
    foreach (object item in employeeList.Items) {
       file.WriteLine(item.toString());
    }
    file.Close();
}

[已更新]

txtFilePathemployeeList 的类型是什么?前者暗示它是一个文本框,后者暗示它可能绑定到非 GUI 元素?(猜测)

你可能还想在末尾追加一个空行,这样在进一步保存时,你就能知道这是一个添加而不是一个长列表(当然取决于你的需求)。


1
由于shan的代码中使用了using指令,所以FileStream的Dispose()方法将被调用。因此,该流将被关闭。 - Dmytro Shevchenko

0

从 .Net Framework 4 开始,您可以这样做:

private void Save_Click(object sender, EventArgs e)
{
        File.AppendAllLines(txtFilePath.Text, employeeList.Items);
}

当然,您可能希望添加一个检查,以确保路径和字符串枚举的有效性。


-1

如果路径看起来像是相对路径(即不以驱动器号开头),那么它将被解释为这样。

  • 如果您在文本框中输入完整路径,文件是否保存在正确的位置? 如果是这样,也许这就是预期的结果。
  • 如果用户没有输入完整路径,您是否有办法使其成为完整路径(例如,在开头加上C:\)? 或者至少可以告诉您何时没有完整路径,并拒绝请求吗?

OP在问题中说路径是C:\employess\employeelist.txt。 - Mr Lister
无论用户想将其保存在哪里,它都可以保存到 E 盘,这取决于用户。路径应该是绝对路径而不是相对路径。但路径是用户想要的。如果你能理解的话。 - shan
C:\employess\employeelist.txt 的路径确实存在。 - shan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接