Создайте файл с помощью DeleteAfterOpen и разрешите другому процессу читать файл - PullRequest
0 голосов
/ 05 июля 2010

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

1 Ответ

0 голосов
/ 05 июля 2010

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

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

...