是否可以使用.net中的FileStream对象创建文件,指定DeleteAfterClose选项并允许对该文件的读访问权?
我尝试过使用:
System.IO.FileStream strBMP = new System.IO.FileStream(sFileName, System.IO.FileMode.Create, System.Security.AccessControl.FileSystemRights., System.IO.FileShare.ReadWrite, 1024, System.IO.FileOptions.DeleteOnClose);
但尝试读取的另一个对象会导致文件共享冲突。
我正在尝试这样做因为我正在创建文件(tif),然后使用COM对象(MODI)对图像执行OCR。我的问题是在我调用MODI com对象上的close方法之后,我仍然无法使用System.File.Delete方法删除该文件,因为MODI com对象还没有完全用它来完成。我想如果我可以使用DeleteAfterClose选项创建我的文件,并且仍然允许读取该文件我将被设置,我只是无法弄清楚如何通过共享违规 - 如果它甚至可能。
答案 0 :(得分:0)
当两个进程打开同一个文件时,它们都需要为第二个打开的成功指定兼容的文件共享标志集。除非您可以控制MODI在打开文件时传递的标志,否则可能无法避免共享冲突;例如,如果它试图以独占模式打开文件,那么无论您将哪些标志传递给FileStream构造函数,如果您的进程打开了文件,它将始终失败。
设计良好的COM对象(此处可能或可能不是这种情况)在发布时不会使文件保持打开状态,因此问题可能与.NET COM互操作层有关;它可能会以一种意想不到的方式使一些MODI COM对象保持活着状态。事实上,关于threads的其他论坛上的this problem都提到了托管代码。 Marshal.FinalReleaseComObject
,GC.Collect
和GC.WaitForPendingFinalizers
的某些组合可能有助于解决问题,但似乎没有人写出明确的解决方案(并且)使用这些功能感觉非常hacky,非常脆弱。