2010-07-05 69 views
0

是否可以使用.net中的FileStream对象创建文件,指定DeleteAfterClose选项并允许对该文件的读取访问权限?使用DeleteAfterOpen创建文件,并允许其他进程读取文件

我已经尝试使用:

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

当两个进程打开同一个文件时,他们都需要指定兼容的文件共享标志集以便第二次打开才能成功。除非您可以控制MODI在打开文件时传递的标志,否则可能无法避免共享冲突;例如,如果它试图以独占模式打开文件,则无论您传递给FileStream构造函数的标志是什么,如果您的进程打开文件,它将始终失败。

设计良好的COM对象(在这里可能会也可能不会)在发布时不会保持文件打开,所以问题可能与.NET COM互操作层有关;它可能会以一种无法预料的方式保留一些MODI COM对象。确实,threads在其他论坛上关于this problem都提到托管代码。有可能Marshal.FinalReleaseComObject,GC.Collect,GC.WaitForPendingFinalizers的某种组合可能有助于解决问题,但似乎没有人写出明确的解决方案(但是),并且使用这些功能感觉非常难以理解且非常脆弱。

相关问题