Почему FileShare.ReadWrite не работает в этом сценарии? - PullRequest
1 голос
/ 10 сентября 2011

Мне нужно открыть один файл в двух разных экземплярах процесса.Два способа открыть файл (оба в каждом процессе) таковы:

m_Stream = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,4*1024,FileOptions.WriteThrough);

и

            [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern SafeFileHandle CreateFile(
            string fileName,
            [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
            [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
            IntPtr securityAttributes,
            [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
            int flags,
            IntPtr template);

m_Stream = new FileStream(                                                                                    //no buffering
                        CreateFile(name, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0x20000000, IntPtr.Zero),
                        FileAccess.ReadWrite);

Теперь я понимаю, что это очень специализированный сценарий с обоимивызов взаимодействия и FileOptions.WriteThrough.Однако FileShare.ReadWrite, похоже, не работает.Второй процесс (с использованием того же кода), который пытается получить доступ к файлу, обычно получает другой процесс, который обращается к этому исключению файла.В рамках того же процесса, кажется, хорошо работает для обмена.Есть мысли?

1 Ответ

2 голосов
/ 10 сентября 2011

Не уверен, как ты это сделал. Объявление pinvoke неверно, 2-й аргумент CreateFile не совместим с FileAccess. Требуется сочетание GENERIC_READ (0x8000000) и GENERIC_WRITE (0x40000000). FileShare на самом деле совместим с флагами winapi. Лучшим вариантом для получения этого права является использование Reflector, ILSpy или Reference Source и просмотр кода для FileStream.Init (). Он выполняет сопоставление между конструктором FileStream и значениями аргументов CreateFile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...