最近用了ABCpdf控件在程序中生成pdf文件并保存到相应文件夹中,结果出现"Unable to write PDF to disk"的错误.
搜索了一下,有人说是ASP.NET用户没有读写权限造成的,可是文件明明已经生成在那个文件夹中了,这个错误是由短时间内连续写那个文件造成的.也就是说前面刚刚写了那个文件,但是还没释放资源,造成了后面的步骤无法进行.
请问:如何才能让程序写完文件后立即释放对文件的控制啊?急死了,想了N种办法都不行,求救!谢谢大家了!
搜索了一下,有人说是ASP.NET用户没有读写权限造成的,可是文件明明已经生成在那个文件夹中了,这个错误是由短时间内连续写那个文件造成的.也就是说前面刚刚写了那个文件,但是还没释放资源,造成了后面的步骤无法进行.
请问:如何才能让程序写完文件后立即释放对文件的控制啊?急死了,想了N种办法都不行,求救!谢谢大家了!
我之前有过这样的经历,打开一个Excel文档,修改后关闭,再打开一个Excel文档,修改后关闭,如此循环几次,但最后打开的EXCEL的句柄总是释放不了,后来是通过执行GC.Collect();解决.您认为楼主的:Clear()方法,会把相关对象的资源都释放掉吗?感觉有点像obj=null;得等待系统下次的垃圾回收
貌似是COM组件,
.NET调用COM组件确实很麻烦,我对这方面不熟,
COM组件内部使用引用计数,当计数为0时,自己完成释放
GC.Collect();试下吧
释放资源,你好是在Dispose上想想吧。
不過沒有碰到過樓主的這個問題。
如果真如樓主所述,原因是“是由短时间内连续写那个文件造成的”,那些在程序中使用同步,避免同時操作該文件,應當可以解決。
至于你说的避免同步使用,这个也不现实,因为这是一个审批流程,上一个经理审批完后,下一个经理接着审批.
现在的问题是doc.Clear(),doc.Dispose()和GC.Collect()这3个都不起作用,哭了...
--------------------------------------
我用的是ABCPdf2,的確是沒有Dispose.
至于你说的避免同步使用,这个也不现实,因为这是一个审批流程,上一个经理审批完后,下一个经理接着审批.
----------------------------------------
我說的是使用同步,避免同時去操作這個文件,這個與你的流程應該沒有直接的關係。
现在的问题是doc.Clear(),doc.Dispose()和GC.Collect()
----------------------------------
GC.Collect僅回收托管內存,非托管肯定不起作用。
關於這個問題,我想LZ應該先仔細自己的代碼,是否存在你調用doc.Clear之前,另外有代碼操作該文件?
一個封閉好的組件,調用Clear,Dispose之後應該是已經釋放了文件句柄的。以前我使用的時候也未遇到過這種情況(當然我用的不多)。
如果是組件內部的問題(調用Clear,Dispose之後不釋放句柄),那么你可能要做適當的錯誤處理,並等待該文件可以操作。