【问题标题】:How to fix StreamWriter error "cannot implicitly convert type string to System.IO.StreamWriter"如何修复 StreamWriter 错误“无法将类型字符串隐式转换为 System.IO.StreamWriter”
【发布时间】:2020-02-13 00:25:41
【问题描述】:

我在 Visual Studio 2017 社区中使用 C#。

我有一个正在尝试优化的工作、功能齐全的程序。简而言之,程序从文本文件中读取文本和数字,进行一些数学运算和重新格式化,然后输出到一个新的文本文件。

我要优化的部分是文本行写入输出文件的方式。以下是有效的:

using System.IO

// Let's start building the MA output text file now.
// Designate an output file --- put it in same directory as original files
// give MA file ame name as the original file -- but different extension.

maOutFile = dir + "\\" + serialNumber[f] + ".ma";

//Create MA header lines and write to file.

string maHeaderLine1 = "TITLE: S/N:" + serialNumber[f] + "\n";
string maHeaderLine2 = "ENGLISH(IN)/METRIC(MM) INDICATOR :IN-P\n";

// Open up the file for writing
File.WriteAllText(maOutFile, maHeaderLine1);
File.AppendAllText(maOutFile, maHeaderLine2);

上面的代码工作正常。我担心它效率不高,尤其是在网络速度较慢的情况下。每次写入文件时都会打开和关闭文件。

所以,为了让它运行得更快,我想我会尝试 StreamWriter。

我的 StreamWriter 代码如下所示:


// Designate an output file --- put it in same directory as the original files
// give MA file same name as the original file -- with different extension.

// maOutFile = dir + "\\" + serialNumber[f] + ".ma";

StreamWriter outfile;
outfile = dir + "\\" + serialNumber[f] + ".ma";

//Create MA header lines and write to file.

string maHeaderLine1 = "TITLE: S/N:" + serialNumber[f] + "\n";
string maHeaderLine2 = "ENGLISH(IN)/METRIC(MM) INDICATOR :IN-P\n";

// Open up the file for writing
//File.WriteAllText(maOutFile, maHeaderLine1);
//File.AppendAllText(maOutFile, maHeaderLine2);
outfile.WriteLine(maHeaderLine1);
outfile.WriteLine(maHeaderLine2);

Visual Studio 不喜欢我使用 StreamWriter 的新代码。它在 "outfile = dir + "\" + serialNumber[f] + ".ma" 行中等号右侧的所有内容下放置一条红线;

当我将鼠标悬停在红线代码上时,消息是“无法将类型字符串隐式转换为 System.IO.StreamWriter”。

我的新代码有什么不喜欢的地方?

【问题讨论】:

  • 哪里出错了?

标签: c# streamwriter


【解决方案1】:

您将字符串变量分配给 StreamWriter 对象,而不是创建 StreamWriter 对象。

试试下面的

using (StreamWriter sw = new StreamWriter(dir + "\\" + serialNumber[f] + ".ma"))
{
string maHeaderLine1 = "TITLE: S/N:" + serialNumber[f] + "\n";
string maHeaderLine2 = "ENGLISH(IN)/METRIC(MM) INDICATOR :IN-P\n";

// Open up the file for writing
//File.WriteAllText(maOutFile, maHeaderLine1);

sw.WriteLine(maHeaderLine1);
sw.WriteLine(maHeaderLine2);
}

【讨论】:

  • 哇!你甚至在我完成编辑之前就回答了我的问题。我现在就试试这个。谢谢。
  • 工作就像一个魅力!谢谢!即使在我的家用电脑上,我也可以看到这要快得多。在我在家的测试中,处理一个充满文件的目录大约需要 3 或 4 秒。现在它几乎是瞬间的。我会在工作中尝试,看看是否有类似的改进。
  • 后续问题:当我第一次尝试实施此修复时,我在完成写入后忘记关闭输出文件。但该软件似乎会自动执行此操作。我刚刚在最后加上了一个 close 语句—— sw.Close(); - 它似乎以同样的方式工作。它会自动关闭每个文件吗?或者,它们是否仍然“开放”?
  • using 确保在其作用域完成执行时完成清理/关闭(sw.WriteLine(maHeaderLine2) 之后)
  • 只是想让您知道,您的解决方案在我的乌龟式网络上表现出色。我现在是 StreamWriter 的倡导者。再次非常感谢您!哦,在实施您的修复程序时,我也对自己开怀大笑。当我第一次将您的代码放入我的程序时,我“按原样”保留了文本行。 -- 其中包括换行符“\n”。所以我第一次运行的时候,每输出一行文字,我也输出一个空行。
【解决方案2】:

您正在尝试在此处将字符串分配给 StreamWriter:

outfile = dir + "\\" + serialNumber[f] + ".ma";

查看您尝试将文件作为流打开的代码,类似于:

string outFileDir = dir + "\\" + serialNumber[f] + ".ma";
StreamWriter outFile = new StreamWriter(outFileDir);

【讨论】:

    【解决方案3】:
     string fileName = dir + "\\" + serialNumber[f] + ".ma" ;  
    try  
       {  
       using (StreamWriter writer = new StreamWriter(fileName))  
          {  
            string maHeaderLine1 = "TITLE: S/N:" + serialNumber[f] + "\n";
            string maHeaderLine2 = "ENGLISH(IN)/METRIC(MM) INDICATOR :IN-P\n";
            writer.Write(maHeaderLine1 + maHeaderLine2);  
          }  
       }  
    catch(Exception exp)  
       {  
          Console.Write(exp.Message);  
       }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 2014-01-28
      • 2015-10-03
      相关资源
      最近更新 更多