最近用了ABCpdf控件在程序中生成pdf文件并保存到相应文件夹中,结果出现"Unable to write PDF to disk"的错误.
搜索了一下,有人说是ASP.NET用户没有读写权限造成的,可是文件明明已经生成在那个文件夹中了,这个错误是由短时间内连续写那个文件造成的.也就是说前面刚刚写了那个文件,但是还没释放资源,造成了后面的步骤无法进行.
请问:如何才能让程序写完文件后立即释放对文件的控制啊?急死了,想了N种办法都不行,求救!谢谢大家了!

解决方案 »

  1.   

    1、楼主你查看一下你所用控件的属性,是否有关闭文件句柄的相关属性,因为程序要写文件,会先开属一个IO,完成操作后,需把这个IO通道关闭,不然那个文件,系统认为是正在打开状态.2、如果该控件不提供关闭文件句柄方法,可在保存之后直接调用 GC.Collect();手动清理垃圾。
      

  2.   

    楼上误导,"GC.Collect();手动清理垃圾"这是释放托管内存的,跟非托管资源没有任何关系~
      

  3.   

    这个控件使用自带的类WebSupergoo.ABCpdf4.Doc来生成pdf文件,保存文件的语句是doc.Save(filename),接下来就是doc.Clear().应该说是有关闭句柄的方法的呀,为什么C#不会立即释放这个文件呢?
      

  4.   

    除了Clear(),还有没有类似于Close()或Dispose()方法?TO:Viena
    我之前有过这样的经历,打开一个Excel文档,修改后关闭,再打开一个Excel文档,修改后关闭,如此循环几次,但最后打开的EXCEL的句柄总是释放不了,后来是通过执行GC.Collect();解决.您认为楼主的:Clear()方法,会把相关对象的资源都释放掉吗?感觉有点像obj=null;得等待系统下次的垃圾回收
      

  5.   

    没有任何其他的Close()或Dispose()方法,只有一个doc.Clear().
      

  6.   

    ydsunny说的有一定道理,
    貌似是COM组件,
    .NET调用COM组件确实很麻烦,我对这方面不熟,
    COM组件内部使用引用计数,当计数为0时,自己完成释放
    GC.Collect();试下吧
      

  7.   

    这个类还有个方法doc.Dispose(),请教下它和doc.Clear()的区别在哪里?
      

  8.   

    GC 可以释放托管资源,对于非托管资源必须手动释放,可以继承IDisposable接口来实现,客户端调用Dispose方法来释放资源。
      

  9.   

    应该调用Dispose,Dispose就是用来释放非托管资源的另外我记得EXCEL的句柄有另外的释放方法,但具体不记得了,应该是不用GC.Collect的
      

  10.   

    文件打开后用完了是要关闭的。是不是你在某个地方没有做关闭处理阿?好好调试你得代码!
    释放资源,你好是在Dispose上想想吧。
      

  11.   

    试着在doc.Clear()之后再调用doc.Dispose(),运行了一下程序,同样的错误仍然存在:(
      

  12.   

    试着把doc.Clear()删掉,仅调用doc.Dispose(),运行了一下程序,还是同样的错误.
      

  13.   

    再试了在doc.Clear()后跟GC.Collect(),同样的错误!
      

  14.   

    釋放資源?把內存拔掉,^-^.用過ABCpdf,公開的屬性和方法很少,衹有Clear用來釋放,至於樓上各位所說的Dispose是沒有的,ABCpdf不是.net組件。
    不過沒有碰到過樓主的這個問題。
    如果真如樓主所述,原因是“是由短时间内连续写那个文件造成的”,那些在程序中使用同步,避免同時操作該文件,應當可以解決。
      

  15.   

    doc.Dispose(),这个方法是存在的,楼上的可能记错了.
    至于你说的避免同步使用,这个也不现实,因为这是一个审批流程,上一个经理审批完后,下一个经理接着审批.
    现在的问题是doc.Clear(),doc.Dispose()和GC.Collect()这3个都不起作用,哭了...
      

  16.   

    doc.Dispose(),这个方法是存在的,楼上的可能记错了. 
    --------------------------------------
    我用的是ABCPdf2,的確是沒有Dispose.
    至于你说的避免同步使用,这个也不现实,因为这是一个审批流程,上一个经理审批完后,下一个经理接着审批. 
    ----------------------------------------
    我說的是使用同步,避免同時去操作這個文件,這個與你的流程應該沒有直接的關係。
    现在的问题是doc.Clear(),doc.Dispose()和GC.Collect()
    ----------------------------------
    GC.Collect僅回收托管內存,非托管肯定不起作用。
    關於這個問題,我想LZ應該先仔細自己的代碼,是否存在你調用doc.Clear之前,另外有代碼操作該文件?
    一個封閉好的組件,調用Clear,Dispose之後應該是已經釋放了文件句柄的。以前我使用的時候也未遇到過這種情況(當然我用的不多)。
    如果是組件內部的問題(調用Clear,Dispose之後不釋放句柄),那么你可能要做適當的錯誤處理,並等待該文件可以操作。