为什么StreamWriter无法写入长度小于或等于3到.csv文件的字符串?

K. *_*son 0 c# csv streamwriter

_flagImageSources是一个.png包含标志文件的195个文件路径的字符串数组.每个文件路径都是格式C:\Users\user\someFolder\...\Flags\xx.png,其中xx是国家/地区代码顶级域名(例如.uk,对于英国).

执行"代码片段1"中的代码时,最初为空的output.csv文件的输出如"CSV文件输出1"所示:

代码片段1

_streamWriter = new StreamWriter("output.csv");

string str;
string outputText;
for (int i = 0; i < _flagImageSources.Length; i++)
{
  str = _flagImageSources[i];
  outputText = str.Substring(68, 6);
  _streamWriter.WriteLine(outputText);
}
Run Code Online (Sandbox Code Playgroud)

CSV文件输出1

ae.png
af.png
?
zw.png
Run Code Online (Sandbox Code Playgroud)

但是,当我将子串长度从6减少到3(或更少)时,我得到输出的输出是一个空.csv文件.

代码片段2

_streamWriter = new StreamWriter("output.csv");

string str;
string outputText;
for (int i = 0; i < _flagImageSources.Length; i++)
{
  str = _flagImageSources[i];
  outputText = str.Substring(68, 3);
  _streamWriter.WriteLine(outputText);
}
Run Code Online (Sandbox Code Playgroud)

CSV文件输出2: "空文件"

我不明白为什么我不能写长度为3(或更少)的字符串到我的.csv文件.有谁知道为什么会这样,以及如何解决?

ror*_*.ap 5

因为您没有刷新输出或正确关闭然后处理流.你需要或者设置AutoFlushtrue或手动调用.Flush(),然后.Close()最终.Dispose().

_streamWriter = new StreamWriter("output.csv");

string str;
string outputText;
for (int i = 0; i < _flagImageSources.Length; i++)
{
  str = _flagImageSources[i];
  outputText = str.Substring(68, 3);
  _streamWriter.WriteLine(outputText);
}

_streamWriter.Flush(); 
_streamWriter.Close();
// prev. two lines are redundant b/c dispose will accomplish this.
_streamWriter.Dispose();
Run Code Online (Sandbox Code Playgroud)

如果您使用Disposable模式,所有这些都将自动发生,这是首选方法:

using (var sw = new StreamWriter("output.csv"))
{
    for (int i = 0; i < _flagImageSources.Length; i++)
    {
      string str = _flagImageSources[i];
      string outputText = str.Substring(68, 3);
      sw.WriteLine(outputText);
    }   
}
Run Code Online (Sandbox Code Playgroud)

  • @CamiloTerevinto - 我发现内联并不总是很好,因为它使调试更棘手; 能够查看上面指定的变量值是件好事.但是,这只是因为它不会导致方法过多. (3认同)
  • 这是流媒体魔力的一部分.它以一种看似不可预测的方式将它写成片段(我确信它有一个逻辑,但我并不在乎).只需实施一次性模式,不要考虑它. (2认同)
  • @ K.Claesson我同意rory你不应该关心,但更具体地说,编写器将缓冲数据并在缓冲区满时执行一次大写操作.第一个例子命中缓冲区长度,第二个例子是较少的数据. (2认同)