Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DeleteAfterOpen创建文件,并允许其他进程读取该文件_C#_.net_File Io_Filestream_Modi - Fatal编程技术网

C# 使用DeleteAfterOpen创建文件,并允许其他进程读取该文件

C# 使用DeleteAfterOpen创建文件,并允许其他进程读取该文件,c#,.net,file-io,filestream,modi,C#,.net,File Io,Filestream,Modi,是否可以使用.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, S

是否可以使用.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选项创建我的文件,并且仍然允许读取我设置的文件,我就不知道如何通过共享冲突-如果可能的话。

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

一个设计良好的COM对象(这里可能是,也可能不是)在发布时不会让文件保持打开状态,因此问题可能与.NET COM互操作层有关;它可能以一种意想不到的方式使一些MODI COM对象保持活动状态。事实上,在其他论坛上,所有人都提到托管代码。
Marshal.FinalReleaseComObject
GC.Collect
GC.WaitForPendingFinalizers
的某些组合可能有助于解决这个问题,但似乎还没有人写出一个明确的解决方案,使用这些函数感觉非常粗糙和脆弱