Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

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

#c_sharp #cpp #cppbuilder


Возникает ошибка открытия бинарного файла: "файл уже открыт". Дело в том, что у меня
есть два приложения: одно, написанное на 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 ReadBinaryFiles(string path)
{
    List testL = new List();

    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();,
чтобы при повторной записи файл был доступен? Может возможно открыть файл с разрешением
на совместный доступ на чтение?
    


Ответы

Ответ 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.

Комментариев нет:

Отправить комментарий