我正在尝试将文字写入我的txt文件。第一次写入应用程序崩溃后出现错误
无法写入已关闭的TextWriter
我的列表包含浏览器打开的链接,我想将所有链接保存在txt文件中(如日志)。
我的代码:
FileStream fs = new FileStream(
"c:\\linksLog.txt", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
for (int i = 0; i < linksList.Count; i++)
{
try
{
System.Diagnostics.Process.Start(browserType, linksList[i]);
}
catch (Exception) { }
using (sw)
{
sw.WriteLine(linksList[i]);
sw.Close();
}
Thread.Sleep((int)delayTime);
if (!cbNewtab.Checked)
{
try
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName == getProcesses)
{
process.Kill();
}
}
}
catch (Exception) { }
}
}
答案 0 :(得分:12)
您处于for
循环中,但是您在第一次迭代时关闭并处置了StreamWriter
:
using (sw)
{
sw.WriteLine(linksList[i]);
sw.Close();
}
相反,删除该块,并将所有内容包装在一个using
块中:
using (var fs = new StreamWriter(@"C:\linksLog.txt", true)) {
foreach (var link in linksList) {
try {
Process.Start(browserType, list);
} catch (Exception) {}
Thread.Sleep((int)delayTime);
if (!cbNewtab.Checked) {
var processes = Process.GetProcessesByName(getProcesses);
foreach (var process in processes) {
try {
process.Kill();
} catch (Exception) {}
}
}
}
}
答案 1 :(得分:2)
问题是你在循环中关闭Stream,应该只在......之后完成。
FileStream fs = new FileStream("c:\\linksLog.txt", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
for (int i = 0; i < linksList.Count; i++)
{
try
{
System.Diagnostics.Process.Start(browserType, linksList[i]);
}
catch (Exception)
{
}
// Removed the using blocks that closes the stream and placed at the end of loop
sw.WriteLine(linksList[i]);
Thread.Sleep((int)delayTime);
if (!cbNewtab.Checked)
{
try
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName == getProcesses)
{
process.Kill();
}
}
}
catch (Exception)
{ }
}
}
sw.Close();
答案 2 :(得分:1)
该行
using (sw)
关闭/处理您的StreamWriter
。
由于您正在循环,因此您将处置已经处置StreamWriter
。
最好在完成所有写操作后关闭循环中的StreamWriter
。
此外,捕获异常并忽略捕获的异常几乎总是一个坏主意。如果您无法处理异常,请不要抓住它。
答案 3 :(得分:1)
那是因为你确实在循环中间关闭了你的流。中间有using (sw)
块,在for
循环的第一次运行中可以正常工作,然后崩溃。要解决此问题,只需停止sw.Close()
来电,然后将using
移至for
循环之外:
答案 4 :(得分:0)
不要在代码中写sw.Close()
,因为如果文件已关闭,则代码无法读取文件。