Russian Qt Forum
Ноябрь 23, 2024, 02:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к одному файлу из разных программ  (Прочитано 4476 раз)
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);

Спасибо!
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Май 18, 2017, 10:35 »

Варианты:
1. Попробуйте в той проге, что пишет логи после написания закрывать файл
2. Или хранить логи в базе простенькой логи (например sqlite)
Записан

ApexUFO
Гость
« Ответ #2 : Май 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 что нибудь есть такое? В доках не нашёл!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 18, 2017, 11:13 »

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

Ну что решаемо - это точно, напр Far всегда умел читать логи которые сейчас пишутся. Для начала попробовать проскочить на шару - попробовать др режим открытия по записи

А как? Пробовал так:
file.open(QIODevice::WriteOnly|QIODevice::Append);
file.open(QIODevice::ReadWrite|QIODevice::Append);
       
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 18, 2017, 12:06 »

А как? Пробовал так:
file.open(QIODevice::WriteOnly|QIODevice::Append);
file.open(QIODevice::ReadWrite|QIODevice::Append);
Дался Вам тот Append - самому сделать seek в конец. Начните с просто ReadWrite
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #6 : Май 18, 2017, 12:42 »

http://doc.qt.io/qt-5/qfilesystemwatcher.html#details
https://habrahabr.ru/sandbox/47189/
алгоритм такой -
1. открыть лог на запись(Append), записать и закрыть
2. по сигналу fileChanged открыть лог на чтение, прочитать и закрыть
« Последнее редактирование: Май 18, 2017, 13:05 от vic57 » Записан
ApexUFO
Гость
« Ответ #7 : Май 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();
}

Всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 23.