FileShare ReadWrite не работает (C # .NET) - PullRequest
2 голосов
/ 14 января 2011

Я использую элемент управления hex-редактора для C #, исходный код и двоичные файлы можно найти здесь .

Одной из проблем при его использовании было то, что если файл был загружен в hex-редактор и другую программу, другая программа не может сохранить файл, потому что он уже используется другим процессом.

Поэтому я попросил автора элемента управления, который сказал мне, установить аргумент FileShare в методе File.Open в классе FileByteProvider, а класс DynamicFileByteProvider для ReadWrite (изначально он был только Read) исправит это. Я так и сделал, но все равно не сработало (та же ошибка). Установка только для записи также не работает, но установка только для чтения и None оба работают. Файлы имеют ту же проблему в любой программе, например, в блокноте. Они не настроены на ReadOnly или что-то еще, поэтому я понятия не имею, почему это не работает.

Есть ли что-то, что я здесь скучаю?

Ответы [ 2 ]

9 голосов
/ 14 января 2011

Возможно, проблема в другой программе - если она пытается открыть файл для монопольного доступа (без общего доступа), не имеет значения, как ваша программа открыла файл - она ​​собирается потерпеть неудачу.


Всякий раз, когда программа пытается открыть файл, вы указываете параметры FileAccess и FileShare (или принимаются значения по умолчанию, если они явно не переданы).

Что нужно сделать Windows, так это проверить все существующие дескрипторы открытых файлов и определить, совместимы ли они. Таким образом, он сравнивает ваш параметр FileAccess с другими параметрами FileShare - разрешено ли вам делать то, что все остальные сказали, что они рады сделать это другим? И затем он выполняет обратную проверку - соответствует ли ваш параметр FileShare с их параметрами FileAccess? - они делают то, что вы рады за них? Только если обе проверки пройдены, ваш конкретный открытый запрос может быть одобрен.

Вы можете использовать что-то вроде Process Monitor для фактического просмотра вызовов Win32, отправляемых на CreateFile , чтобы увидеть, что на самом деле делает каждый процесс.


Блокнот может открыть файл, который был предоставлен для чтения / записи, но не может выполнить обратную запись в файл. Пример программы:

using System.IO;

namespace ConsoleApplication2
{
    class Program
    {

        static void Main(string[] args)
        {
            var fs = new FileStream(@"C:\Bar.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
            fs.Write(System.Text.Encoding.ASCII.GetBytes("abc"),0,3);
            fs.Flush();
            fs.Close(); //<-- Breakpoint here
        }
    }
}

Установите заданную точку останова, запустите программу. Когда он достигнет точки останова, откройте Блокнот и используйте его, чтобы открыть C: \ Bar.txt. Все отлично. Добавьте больше текста в файл и нажмите «Сохранить». Вы получите сообщение об ошибке.

0 голосов
/ 14 января 2011
  1. Изменить на ReadWrite.
  2. Рекомпилированные.
  3. Попробуйте открыть файл, который вы еще не открывали, и проверьте, появляется ли проблема.

Возможно, вы не закрывали файл надлежащим образом, поэтому он оставался открытым даже после закрытия приложения (с предыдущими разрешениями, установленными на Чтение)

...