Delphi HTTP应用在将文件加载到流中时出现错误

4

我一直在开发一个HTTP Web服务器应用程序(通过TIdHTTPWebBrokerBridge),在将文件载入流(TFileStream)以发送给客户端时,遇到了一些小问题。这并不是每次都会发生,但相当随机... 我一直收到异常...

无法打开文件“C:\SomePath\SomeFile.html”。该过程无法访问该文件,因为另一个进程正在使用它。

它会在以下行上发生:

Str:= TFileStream.Create('C:\SomePath\SomeFile.html', fmOpenRead);

(其中,Str 是TFileStream)

我想这条信息说明了问题,但我绝对需要避免它。这个异常只在调试模式下发生,但我需要在调试过程中不必一直担心这个消息。

奇怪的是,大多数情况下,文件仍然被加载并发送回去。

我该如何避免这种情况?即使是只读的为什么也不能打开多次呢?


4
你的代码没有使用共享模式……也许只需要使用fmShareDenyWritefmShareDenyNone就可以解决问题,参见http://docwiki.embarcadero.com/Libraries/en/System.Classes.TFileStream.Create。 - ain
1个回答

6

正如@ain在评论中所述,您的构造函数中缺少共享模式。

请改为

Str:= TFileStream.Create('C:\SomePath\SomeFile.html', fmOpenRead);

转换为这样

Str:= TFileStream.Create('C:\SomePath\SomeFile.html', fmOpenRead or fmShareDenyNone);

是的,就是这样!这表明永远不要完全相信你在互联网上找到的任何示例源代码 :P - Jerry Dodge
我希望Delphi中默认的打开+共享模式是fmOpenRead + fmShareDenyWrite,这将解决许多初学者遇到的问题。 - Jeroen Wiert Pluimers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接