Russian Qt Forum
Июля 03, 2025, 06:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile и linux  (Прочитано 7204 раз)
onyborak
Гость
« : Сентября 15, 2016, 22:01 »

Добрый вечер. Вопрос касаемо сохранения файла с помощью класса QFile на linux.

Собственно проблема:
Хочу сохранить файл на примонтированном usb носителе.
Открываю файл, сохраняю туда информацию, делаю QFile::flush() и закрываю его. Через команду ls вижу данный файл, затем просто выдергиваю флешку, затем опять ее вставляю. Через команду ls этого файла больше не вижу, его вообще нет на флешке. За редким исключением, он все таки иногда сохраняется и его видно после извлечения и вставки обратно. Вариант использовать системный вызов sync и безопасное извлечение не подходит. Необходимо чтобы это работало при экстренном извлечении носителя. Данный фрагмент кода отрабатывает полностью.
Собственно сам код:
Код:
    QFile TMPPlaylist(NameTMPPlayList);
    file.file_name = song.name;
    file.full_path = path;
    tmp_playlist.push_back(file);
    if (TMPPlaylist.open(QIODevice::Append | QIODevice::Text)) {
      qDebug() << "WRITE In= PlayList " << NameTMPPlayList << "song = " << path.toUtf8();
      QTextStream writeStream(&TMPPlaylist);
      writeStream << path << "\n";
      qDebug()<<"FLASH RETURN = " <<TMPPlaylist.flush();
      TMPPlaylist.close();
    }

Что еще можно попробовать сделать, чтобы этот файл все таки сохранился?
« Последнее редактирование: Сентября 15, 2016, 22:20 от onyborak » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Сентября 15, 2016, 23:52 »

http://linux.die.net/man/2/fsync ?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #2 : Сентября 16, 2016, 08:38 »

Вариант использовать системный вызов sync и безопасное извлечение не подходит.

можно попробовать настроить опции монтирования для usb дисков (сам я не пробовал, но думаю такое возможно)

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Сентября 16, 2016, 12:54 »

QSaveFile еще попробуй
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
onyborak
Гость
« Ответ #4 : Сентября 16, 2016, 20:44 »

можно попробовать настроить опции монтирования для usb дисков (сам я не пробовал, но думаю такое возможно)

Да, есть. Но монтирование с опцией sync в моем случае это тоже плохо, т.к. все равно будут задержки в ПО тогда, когда это не нужно. Хотелось бы именно сделать запись конкретного файла и в конкретный момент времени.

По поводу fsync и QSaveFile попробую.
Записан
onyborak
Гость
« Ответ #5 : Сентября 16, 2016, 22:08 »

fsync не помог. Метод возвращает 0, но при этом все равно файла на носителе нет.
Записан
onyborak
Гость
« Ответ #6 : Сентября 16, 2016, 22:12 »

QSaveFile еще попробуй
с помощью QSaveFile::commit не работает. Метод всегда почему-то возвращает false.
Записан
onyborak
Гость
« Ответ #7 : Сентября 16, 2016, 22:13 »

Может быть есть еще какие идеи?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #8 : Сентября 17, 2016, 11:04 »

Хотелось бы именно сделать запись конкретного файла и в конкретный момент времени.

как это понимать ? нужно записать файл например строго в 13:13 ?
Записан
onyborak
Гость
« Ответ #9 : Сентября 19, 2016, 19:08 »

как это понимать ? нужно записать файл например строго в 13:13 ?

Под определенным временем я тут подразумеваю: когда программа закончила выполнение этой функции, файл появился уже на носителе.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #10 : Сентября 20, 2016, 09:07 »

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

гарантировать это может umount, вызванной этой функцией
почему нельзя вызвать umount ?
Записан
titan83
Гость
« Ответ #11 : Сентября 22, 2016, 13:23 »

Не вы первый, не вы последний.
Код:
system("sync");
поможет, точно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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