【问题标题】:C# FileStream creating new .csv file but not writing to itC# FileStream 创建新的 .csv 文件但不写入它
【发布时间】:2017-08-20 23:40:18
【问题描述】:

您好,我正在尝试将数据写入 .csv 文件。我的代码正在创建新文件,但没有写入。这是代码的较短版本,其中名称、年龄和性别变量已经预先确定。在我的实际应用程序中,这些变量来自文本框(我已确保来自文本框的数据实际上是使用 MessageBox 填充这些变量)。

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string filePath = "C:\\Users\\Jamie\\Desktop\\test.csv";
            string name = "jamie";
            int age = 69;
            string sex = "male";

            if (!(File.Exists(filePath)))
            {
                FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write);
                if (fs.CanWrite)
                {
                    string columnTitles = "name,age,sex\n";
                    fs.Write(Encoding.ASCII.GetBytes(columnTitles), 0, 0);
                    string input = name + "," + age + "," + sex + "\n";
                    fs.Write(Encoding.ASCII.GetBytes(input), 0, 0);
                    fs.Flush();
                    fs.Close();
                }
            }
            else
            {
                FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write);
                if (fs.CanWrite)
                {
                    if (new FileInfo(filePath).Length == 0)
                    {
                        string columnTitles = "name,age,sex\n";
                        fs.Write(Encoding.ASCII.GetBytes(columnTitles), 0, 0);
                    }
                    string input = name + "," + age + "," + sex + "\n";
                    fs.Write(Encoding.ASCII.GetBytes(input), 0, 0);
                    fs.Flush();
                    fs.Close();
                }
            }
        }
    }
}

【问题讨论】:

  • 您指定它写入零字节:msdn.microsoft.com/en-us/library/… 在一行中获取您的字节,然后将它们写入下一行。
  • 你有什么理由不使用这样的东西吗? msdn.microsoft.com/en-us/library/92e05ft3(v=vs.110).aspx
  • 哎呀,我现在看到了,谢谢
  • 如果您的 csv 字段中有换行符、逗号或引号,请考虑使用 CSV 写作库。
  • 在 try catch 块中编写代码始终是一个好习惯,这样您就可以轻松跟踪代码中的错误

标签: c# csv filestream


【解决方案1】:

使用以下代码编写:

   fs.Write(Encoding.ASCII.GetBytes(input), 0, ASCIIEncoding.ASCII.GetByteCount(input));

FileStream Write 方法的第三个参数需要知道要写入的最大字节数。您将 0 字节指定为在您的情况下要写入的最大字节,因此它不会写入文件。

除了你的错误,我建议使用using statement,因为 FileStream 实现了 IDisposable 接口,一旦超出 using 语句的范围,它就会处理刷新流。

using(FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write))
{
    if (fs.CanWrite)
        {
            string columnTitles = "name,age,sex\n";
            fs.Write(Encoding.ASCII.GetBytes(columnTitles), 0, 0);
            string input = name + "," + age + "," + sex + "\n";
            fs.Write(Encoding.ASCII.GetBytes(input), 0, ASCIIEncoding.ASCII.GetByteCount(input));
        }
}

【讨论】:

    【解决方案2】:

    问题:

    我首先测试了您的代码,经过一段时间的处理后,我发现了您的错误所在。具体来说,您没有告诉fs.Write() 要写入的字节数,只告诉它 0。因此它什么也没输入。

    解决方案:

    为了解决这个问题,第三个参数,一个整数,在方法中调用 count 应该设置为他们byte[] 的长度。

    其他选项:

    您可能想看看System.IO.StreamWriter,它会让您在将字符串写入文件时变得更加轻松。

    祝你有美好的一天!

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多