2011-11-16 95 views
1

我试图关闭我创建的文本文件,然后将其读回到HTMLDocumentClass中。C#关闭StreamWriter

这是代码

StreamWriter outfile = 
    new StreamWriter(StripHTMLComps.Properties.Settings.Default.TempFileName); 
outfile.Write(HTML); 
outfile.Close(); 

HTMLDocumentClass doc = null; 
doc = new HTMLDocumentClass(); 
IPersistFile persistFile = (IPersistFile)doc; 
persistFile.Load(StripHTMLComps.Properties.Settings.Default.TempFileName, 0); 
GC.SuppressFinalize(persistFile); 
int start = Environment.TickCount; 
while (doc.readyState != "complete") 
{ 
    if (Environment.TickCount - start > 10000) 
    { 
    } 
} 

文件称加载,但从来没有完成,我相信,它认为该文件是仍在使用由另一个进程。

任何想法?

+0

你的while循环应该做什么?等到做完了什么?因为现在,这不是真的“等待”吗? (StreamWriter outfile = new StreamWriter(StripHTMLComps.Properties.Settings.Default.TempFileName)) – jv42

回答

4

裹建立在using声明的字符串正确进行处理(其中有一部分会释放文件句柄 - 感谢@Adam Houldsworth):

using(StreamWriter outfile = new StreamWriter(StripHTMLComps.Properties.Settings.Default.TempFileName)) 
{ 
    outfile.Write(HTML); 
    // outfile.Close(); // not needed, as the disposal will close the file. 
} 

// read the file now 
+0

outfile.Write(HTML); outfile.Close(); } – Steven

+0

这不是真正的问题的答案,应该是一个真正的答案评论或旁注。此外,只有html编写代码应该在使用我认为,而不是其余的代码 – musefan

+0

@steven,不需要显式关闭使用语句中的流,它会自动完成。我还建议你在调试模式下逐步执行代码 – musefan

2

我相信HTMLDocumentClass从web浏览器。

我不确定如果没有浏览器控件,你可以使用,但如果可以的话,你不要给它CPU周期来处理文件。

尝试在某处添加Application.DoEventsSleep

如果这不起作用,请将WebBrowser添加到表单中,使其加载html并使用浏览器公开的对象。

如果您只是对解析html树感兴趣,请查看Html Agility Pack

+0

代码写入从另一个第三方应用程序调用的DLL中。 – Steven

+0

DoEvents工作处理 – Steven

0

在有太多的假设,我

using(FileStream fs = new FileStream(SomeName,...)) 
{ 
    StreamWriter s = new Streamwriter(fs); 
    s.Write(HTML); 
    s.Flush(); 
} 

现在应该没关系使用。我有一个策略,总是使用显式权限请求使用FileStream打开/创建文件。如果有些东西不对,你希望这一点倒下,而不是一些二十分钟后代码和十码深处的代码。 另一个需要考虑的问题是为什么你需要HTMLDocumentClass,它是一个com对象的辅助包装器,用于Web浏览器控制和充满古怪的塞子。

无法确认这一点,但我看到一个报告,为了让doc状态完成,您必须在未完成循环内调用DoEvents。

Somebody else witha similar issue

+0

谢谢DoEvent的工作 – Steven