Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ApexUFO от Май 18, 2017, 10:30



Название: Доступ к одному файлу из разных программ
Отправлено: ApexUFO от Май 18, 2017, 10:30
Добрый день!
В программе в файл постоянно идёт запись логов, а другая должна (но не может) открыть этот файл на чтение. Как нужно сделать так, чтобы появился доступ на чтение к файлу. Использую в программе (которая пишет логи), вот такой код:

Код:
    QFile file;
    QTextStream out;

    QDir dir;
    dir.setPath(path);
    file.setFileName(dir.filePath(name));
    file.open(QIODevice::Text|QIODevice::Append);

    if(!file.isOpen())
    {
        qDebug()<<file.errorString();
        return;
    }
    out.setDevice(&file);

Спасибо!


Название: Re: Доступ к одному файлу из разных программ
Отправлено: gil9red от Май 18, 2017, 10:35
Варианты:
1. Попробуйте в той проге, что пишет логи после написания закрывать файл
2. Или хранить логи в базе простенькой логи (например sqlite)


Название: Re: Доступ к одному файлу из разных программ
Отправлено: ApexUFO от Май 18, 2017, 11:08
Варианты:
1. Попробуйте в той проге, что пишет логи после написания закрывать файл
2. Или хранить логи в базе простенькой логи (например sqlite)


1. Если закрывать файл, то может получится так, что вторая программа заблокирует файл для первой. Разве нет?
2. К сожалению, на той машине, где будет крутится первая программа, разрешений на установку, даже SQLite, у меня нет.

В C# использовал такую конструкцию:
Код:
file = new StreamReader(new FileStream(path + "test.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete));
А в Qt что нибудь есть такое? В доках не нашёл!


Название: Re: Доступ к одному файлу из разных программ
Отправлено: Igors от Май 18, 2017, 11:13
Ну что решаемо - это точно, напр Far всегда умел читать логи которые сейчас пишутся. Для начала попробовать проскочить на шару - попробовать др режим открытия по записи


Название: Re: Доступ к одному файлу из разных программ
Отправлено: ApexUFO от Май 18, 2017, 11:45
Ну что решаемо - это точно, напр Far всегда умел читать логи которые сейчас пишутся. Для начала попробовать проскочить на шару - попробовать др режим открытия по записи

А как? Пробовал так:
file.open(QIODevice::WriteOnly|QIODevice::Append);
file.open(QIODevice::ReadWrite|QIODevice::Append);
       


Название: Re: Доступ к одному файлу из разных программ
Отправлено: Igors от Май 18, 2017, 12:06
А как? Пробовал так:
file.open(QIODevice::WriteOnly|QIODevice::Append);
file.open(QIODevice::ReadWrite|QIODevice::Append);
Дался Вам тот Append - самому сделать seek в конец. Начните с просто ReadWrite


Название: Re: Доступ к одному файлу из разных программ
Отправлено: vic57 от Май 18, 2017, 12:42
http://doc.qt.io/qt-5/qfilesystemwatcher.html#details
https://habrahabr.ru/sandbox/47189/
алгоритм такой -
1. открыть лог на запись(Append), записать и закрыть
2. по сигналу fileChanged открыть лог на чтение, прочитать и закрыть


Название: Re: Доступ к одному файлу из разных программ
Отправлено: ApexUFO от Май 19, 2017, 12:09
Нашёл ответ! Чтобы доступ к файлу смогли иметь другие программы, нужно в начале выполнить запись буфера в основной поток out.flush(), а затем записать данные в файл file.flush() и закрывать файл при этом уже не нужно!

Код:
QFile file;
QTextStream out;

void Logger::StartLogger(QString path, QString name)
{
    if(name.isEmpty())
        name = "NoName.log";

    QDir dir;
    dir.setPath(path);
    file.setFileName(dir.filePath(name));
    file.open(QIODevice::Text|QIODevice::Append);

    if(!file.isOpen())
    {
        qDebug()<<file.errorString();
        return;
    }
    out.setDevice(&file);
}

void Logger::StopLogger()
{
    file.close();
}

void Logger::LogWrite(QString str)
{
    out.setCodec("UTF-8");
    out<<QDateTime::currentDateTime().toString("dd.MM.yyyy HH:mm:ss")<<"    "<<str<<"\n\r";
    out.flush();
    file.flush();
}

Всем спасибо!