Совместный доступ к файлам из разных процессов

337
31 января 2017, 19:39

Возникает ошибка открытия бинарного файла: "файл уже открыт". Дело в том, что у меня есть два приложения: одно, написанное на C++Builder:

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
    TFileStream *fileStream;
    fileStream->Free(); 
    fileStream = new TFileStream("E:/DELETE/n.dat",fmOpenReadWrite);
}
void __fastcall TForm1::StringGrid2SetEditText(TObject *Sender, int ACol,
      int ARow, const UnicodeString Value)
{
    fileStream->Position = (sizeof(nr) * nn);
    fileStream->Write(&nrt.nn, sizeof(nr));
}

В данном приложении вносятся изменения и сохраняются в файл. Далее я читаю в C# то что записалось:

private List<Int32> ReadBinaryFiles(string path)
{
    List<Int32> testL = new List<Int32>();
    Int32 obj = 0;
    try
    {
        using (BinaryReader reader = new BinaryReader(
                File.Open(
                        path, 
                        FileMode.Open, 
                        FileAccess.Read, 
                        FileShare.ReadWrite)))
        {
            while (reader.PeekChar() > -1)
            {
                obj = reader.ReadInt32();
                testL.Add(obj);
            }
        }
    }
    catch (Exception e)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Ошибка: {0}", e.Message);
        Console.ResetColor();
    }
    return testL;
}

Я понимаю, что вверху нужно закрыть этот файл, но мне нужно работать с файлом без его закрытия, возможно что-то придумать? Если нет, тот где правильно поставить fileStream->Free();, чтобы при повторной записи файл был доступен? Может возможно открыть файл с разрешением на совместный доступ на чтение?

Answer 1

Возможно вам нужен fmShareDenyNone (для С++) и FileShare.ReadWrite (для C#).

Это даст вам возможность открыть файл так чтоб другие процессы тоже могли с ним работать.

fileStream = new TFileStream("E:/DELETE/n.dat", fmOpenReadWrite | fmShareDenyNone);

fmShareDenyNone is one of the attributes assignable in the Create. The TFileStream is used to read and write files. It specifies file sharing that does not prevent any other applications from reading from or writing to the file.

READ ALSO
C#. Можно ли перегрузить операторы сравнения в обобщенных классах?

C#. Можно ли перегрузить операторы сравнения в обобщенных классах?

Есть следующий обобщенный класс (он пока не реализован до конца):

275
Краш билда при запуске на Sony xperia XZ, libeGL : error 3009 (EGL_BAD_MATCH)

Краш билда при запуске на Sony xperia XZ, libeGL : error 3009 (EGL_BAD_MATCH)

Веду разработку на unity3d, скрипты пишу на с#, опыт разработки у меня крайне небольшойБилд вылетает при запуске на телефоне Sony xperia XZ (на explay fire все...

283
Что это за синтаксис в передаче параметра - &ldquo;new object[] {s}&rdquo;

Что это за синтаксис в передаче параметра - “new object[] {s}”

Интересует - ,new object[] {s}) Почему s в фигурных скобках?

298
simplexml_load_file тире и массив

simplexml_load_file тире и массив

Интересная ситуация получаетсяИспользую simplexml_load_file

311