2010-07-05 3 views
0

Возможно ли создать файл с использованием объекта FileStream в .net, указав параметр 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 на изображении. Моя проблема заключается в том, что накануне, когда я вызываю метод close в объекте MODI com, я все еще не могу удалить файл с помощью метода System.File.Delete, потому что объект MODI com не совсем финишировал с ним. Я думал, что если я смогу создать свой файл с опцией DeleteAfterClose и по-прежнему разрешить чтение в этом файле, который я бы установил, я просто не могу понять, как получить переданное нарушение - если это возможно.

ответ

0

Когда два процесса открывают один и тот же файл, им необходимо указать совместимые наборы флагов для совместного доступа к файлам для второго открытия для успеха. Если вы не сможете контролировать флаги, передаваемые MODI, когда он открывает файл, вероятно, нет способа избежать нарушения совместного использования; например, если он пытается открыть файл в эксклюзивном режиме, он всегда будет терпеть неудачу, если ваш процесс откроет файл, независимо от того, какие флажки вы передаете конструктору FileStream.

Хорошо спроектированный COM-объект (который может быть или не может быть здесь) не оставит файлы открытыми, когда он будет выпущен, поэтому проблема может быть связана с слоем взаимодействия .NET COM; возможно, что он сохраняет некоторые MODI COM-объекты живыми непредвиденным образом. Действительно, threads на других форумах около this problem все упоминание управляемый код. Вполне возможно, что некоторая комбинация Marshal.FinalReleaseComObject, GC.Collect и GC.WaitForPendingFinalizers может помочь решить проблему, но никто, кажется, не написал окончательного решения (пока), и использование этих функций кажется чрезвычайно хакированным и очень хрупким.