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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Извлечение ресурса из qrc в QTemporaryFile  (Прочитано 21640 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #15 : Декабрь 27, 2012, 18:11 »

Разве можно открыть дескриптор несуществующего файла на чтение, записать этот файл сторонним способом и потом читать из открытого дескриптора? Или я просто чего-то не понимаю во временных файлах (никогда ими не пользовался, все руками делал)?
Записан

Изучением 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
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #16 : Декабрь 27, 2012, 19:27 »

Не получается. Что не так?
Код:
QFile file("://ir_inter.wav");
    QTemporaryFile ptemp;
    if(ptemp.open()){
        if(file.copy(ptemp.fileName() + ".wav")){

             QSound::play(ptemp.fileName() + ".wav");

                    }
    }
     QString str = ptemp.fileName();
    str += ".wav";
    file.close();
    ptemp.close();
    QFile::remove(str);

Ты какую-то херню написал, сам подумай. Ты открываешь временный файл, а потом копируешь данные в совершенно другой файл (file.copy(ptemp.fileName() + ".wav")).
Записан
Hellrider
Гость
« Ответ #17 : Декабрь 27, 2012, 19:46 »

Не получается. Что не так?
Код:
QFile file("://ir_inter.wav");
    QTemporaryFile ptemp;
    if(ptemp.open()){
        if(file.copy(ptemp.fileName() + ".wav")){

             QSound::play(ptemp.fileName() + ".wav");

                    }
    }
     QString str = ptemp.fileName();
    str += ".wav";
    file.close();
    ptemp.close();
    QFile::remove(str);

Ты какую-то херню написал, сам подумай. Ты открываешь временный файл, а потом копируешь данные в совершенно другой файл (file.copy(ptemp.fileName() + ".wav")).
Создаю объект временного файла ptemp, потом копирую в него file.  В какой тут еще другой файл можно копировать? К тому же это работает. Вопрос в том, как удалить временный файл,
после его закрытия, учитывая что после копирования у файла стоит атрибут Read only?
Записан
Bepec
Гость
« Ответ #18 : Декабрь 27, 2012, 20:06 »

Открой свой разум.
Смотри
Код:
 QString str = ptemp.fileName();
// ты получил имя созданного файла. Полное имя. НАИБОЛЕЕ ПОЛНОЕ. Полнее не бывает.
//допустим это имя "qt_temp.wav"
    str += ".wav";
//А этой строкой ты добавляешь к ПОЛНОМУ названию ещё 1 расширение.
// И получаешь "qt_temp.wav.wav"
"qt_temp.wav" НЕ РАВНО "qt_temp.wav.wav"
Записан
Hellrider
Гость
« Ответ #19 : Декабрь 27, 2012, 20:13 »

Открой свой разум.
Смотри
Код:
 QString str = ptemp.fileName();
// ты получил имя созданного файла. Полное имя. НАИБОЛЕЕ ПОЛНОЕ. Полнее не бывает.
//допустим это имя "qt_temp.wav"
    str += ".wav";
//А этой строкой ты добавляешь к ПОЛНОМУ названию ещё 1 расширение.
// И получаешь "qt_temp.wav.wav"
"qt_temp.wav" НЕ РАВНО "qt_temp.wav.wav"
fileName() не возвращает расширение.  Вот
Код:
//До присвоения расширения str += ".wav";
"C:/Users/Use/AppData/Local/Temp/qt_temp.Hp5936"
//После присвоения  str += ".wav";
"C:/Users/Use/AppData/Local/Temp/qt_temp.Hp5936.wav"
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #20 : Декабрь 27, 2012, 20:49 »

Плейер проигрывает не по расширению, а по заголовку. Не все-ли равно какое расширение (или его отсутствие) у временного файла?
Записан
Hellrider
Гость
« Ответ #21 : Декабрь 27, 2012, 23:34 »

Переделал копирование файла в обычный QFile.
Код:
QFile file("://ir_inter.wav");
    QFile temp;
    QString str = QDir::toNativeSeparators(QDir::tempPath()) + QDir::separator();
    temp.setFileName(str);
    qDebug() << str;

        if(file.copy(str+="qt_tep")){
                    QSound::play(str);
                                }
    file.close();
    temp.close();
    QFile::remove(str);
Тут все хорошо. Но, файл не удаляется, потому что имеет атрибут read only. Пробовал через setPermission изменить атрибут, но ничего не получается.
Как вообще через Qt, можно изменить атрибуты файла в NTFS файловой системе?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #22 : Декабрь 27, 2012, 23:39 »

только через WinAPI раз setPermission не помогает.

может он ридонли потому, что твой исходный файл такой? или заключение файла в ресурсы делает его таким?

как вариант — копируй содержимое файла, а не сам файл.
Записан

Изучением 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
Bepec
Гость
« Ответ #23 : Декабрь 28, 2012, 06:54 »

Файл в ресурсах рид онли Улыбающийся эт я как то раз уже проверял.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #24 : Декабрь 28, 2012, 08:19 »

Я думаю ридонли тут не при чём. Просто проигрывание не успевает выполниться и «держит» файл.
Для проверки после play поставьте слип длинной больше чем длина аудио.
Записан
Hellrider
Гость
« Ответ #25 : Декабрь 28, 2012, 09:53 »

Я думаю ридонли тут не при чём. Просто проигрывание не успевает выполниться и «держит» файл.
Для проверки после play поставьте слип длинной больше чем длина аудио.

Уже проверялось - результат тот же, даже если просто создавать файл и не проигрывать его.
Рид онли не дает удалить файл, я уверен. Тут как писали выше, 2 варианта: 1. копировать данные из файла в файл 2. воспользоваться winapi.
Очень интересно, как реализовать первый вариант, ибо слабо представляю как это сделать.
------------
Реализовал снятие атрибута через winapi - теперь файл без проблем удаляется.
Код:
QFile file("://ir_inter.wav");
    QFile temp;
    QString str = QDir::toNativeSeparators(QDir::tempPath()) + QDir::separator();
    temp.setFileName(str);
            if(file.copy(str+="qt_tep")){
            qDebug() << str;
            QSound::play(str);
            qDebug() << "true";
                    }
   std::wstring wpath = str.toStdWString();
   const wchar_t* pchar = wpath.c_str();
   SetFileAttributes(pchar, FILE_ATTRIBUTE_NORMAL);

    file.close();
    temp.close();
    QFile::remove(str);
« Последнее редактирование: Декабрь 28, 2012, 10:27 от Hellrider » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #26 : Декабрь 28, 2012, 10:23 »

Только что проверил remove с setPermissions работает:
Код
C++ (Qt)
       QFile file( "C:\\1.txt" );
       qDebug() << file.setPermissions( QFile::WriteUser );
       qDebug() << file.remove();
Записан
Hellrider
Гость
« Ответ #27 : Декабрь 28, 2012, 10:28 »

Только что проверил remove с setPermissions работает:
Код
C++ (Qt)
       QFile file( "C:\\1.txt" );
       qDebug() << file.setPermissions( QFile::WriteUser );
       qDebug() << file.remove();

перед этим, на файл поставили атрибут рид онли?  Смеющийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #28 : Декабрь 28, 2012, 10:30 »

С каких это пор пермижены файла запрещают его удалять? Удаление файла - операция над каталогом, в котором файл этот находится, и тут важны пермижены каталога.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #29 : Декабрь 28, 2012, 10:35 »

Попробуй так.

Код
C++ (Qt)
const QString outputFile = QDir::tempPath() + "/ir_inter.wav";
QFile::copy ("://ir_inter.wav", outputFile);
QSound::play(outputFile);
QFile::remove(str);
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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