qt создает временные файлы

1. Временная файловая система

        В системах Linux создать временную файловую систему очень просто: достаточно выполнить следующую команду:

mount -t tmpfs -o size=1024m tmpfs /mnt/tmp

        После успешного монтирования все файлы, созданные в точке монтирования /mnt/tmp, станут временными файлами, то есть эти файлы исчезнут при выключении компьютера.

        Преимущество этого в том, что не требуется никаких операций ввода-вывода на жестком диске, а скорость чтения и записи очень высокая!

2. Класс QTemporaryFile

        Функция: Создать временный файл. Временный файл — это путь к входному файлу + символ «.» + 6 случайных символов.

        QTemporaryFile используется для безопасного создания уникального временного файла. Временный файл создается путем вызова open(), и его имя уникально (т.е. гарантированно не перезаписывает существующий файл).Временный файл будет удален при уничтожении объекта QTemporaryFile. Это важный метод, позволяющий избежать повреждения данных приложения, хранящихся во временных файлах.

2.1. Примеры использования

#include <QTemporaryFile>

QTemporaryFile file;
if (file.open())
{
    // file.close();
    qDebug() << "tempPath:" << QDir::tempPath();
    qDebug() << "fileTemplate:" << file.fileTemplate();  // 获得模板路径
    qDebug() << "fileName:" << file.fileName(); // 获得唯一的名称
}

результат:

tempPath: "C:/Users/i/AppData/Local/Temp"
fileTemplate: "C:/Users/i/AppData/Local/Temp/project.XXXXXX"
fileName: "C:/Users/i/AppData/Local/Temp/project.qixEmr

        а) После определения QTemporaryFile, если он не открыт или не открывается, file.fileName() возвращает пустую строку;

        б) file.open() создает временный файл. Если это не удается, это происходит из-за отсутствия разрешения или по другим причинам;

        в) Безопасно повторно открыть QTemporaryFile после вызова close(). Пока объект временного файла не был уничтожен, временный файл всегда будет существовать и оставаться открытым внутри QTemporaryFile;

        г) Во временном файле будут некоторые статические имена деталей и уникальные расчетные детали. Имя файла по умолчанию определяется QCoreApplication:applicationName() (в противном случае qt_temp) и помещается во временный путь, возвращаемый QDir::tempPath(). Если указано имя файла, относительный путь к файлу не будет помещен во временный каталог по умолчанию, а будет относительным к текущему рабочему каталогу;

        д) Указанное имя файла может содержать следующий шаблон XXXXXX (6 символов "X" в верхнем регистре), который будет заменен автоматически сгенерированной частью имени файла. Шаблон чувствителен к регистру. Если имя файла не существует в шаблона, QTemporaryFile добавит части Generate к заданному имени файла.

2.2. Знакомство с часто используемыми API

        bool open(): // QTemporaryFile всегда открыт в режиме QIODevice::ReadWrite (чтение-запись), что облегчает доступ к данным в файле. Возвращает true в случае успеха и присваивает fileName() уникальное имя файла;

        bool open(OpenMode flags): // Переопределите QIODevice::open(), создайте уникальное имя для временного файла и откройте его. Затем получите уникальное имя, вызвав fileName();

        bool autoRemove() const : // Режим автоматического удаления.

        void setAutoRemove(bool b): // Устанавливаем, переходить ли в режим автоматического удаления. По умолчанию режим автоматического удаления включен.

        QString fileTemplate() const: // Получаем шаблон файла.

        void setFileTemplate(const QString & name): //Устанавливаем шаблон файла. Шаблон файла по умолчанию — qcoreappname.XXXXXX, который размещается в каталоге QDir::tempPath().

        virtual QString fileName() const: // Переопределите QFileDevice::fileName(), чтобы получить полное уникальное имя файла. До открытия QTemporaryFile возвращаемое значение пусто, а затем оно будет содержать fileTemplate() и другие символы, чтобы сделать его уникальным.

        QTemporaryFile * createNativeFile(QFile & file): // Создаем локальный временный файл. Если файл не является локальным, используйте QDir::tempPath(), чтобы создать QTemporaryFile и скопировать в него содержимое файла. Если файл является локальным, верните 0 и ничего не делайте.

QFile f(":/resources/file.txt");
QTemporaryFile::createNativeFile(f); // 返回一个QTemporaryFile指针

QFile f("/users/qt/file.txt");
QTemporaryFile::createNativeFile(f); // 返回0

        QTemporaryFile * createNativeFile(const QString & fileName): // Это перегруженная функция, которая применяется к заданному имени файла, а не к существующему объекту QFile.

2.3. Примеры использования

// 设置模板名称
QString strFileName = QDir::tempPath() + QDir::separator() +
            QCoreApplication::applicationName() + "_XXXXXX." + "docx";
QTemporaryFile tmpFile(strFileName);

// 设置为不自动删除
tmpFile.setAutoRemove(false);

qDebug() << "tempPath : " << QDir::tempPath();

if (tmpFile.open())
{
    tmpFile.close();

    QString strFileTemplate = tmpFile.fileTemplate();
    QString strFileName = tmpFile.fileName();

    qDebug() << "fileTemplate : " << strFileTemplate;
    qDebug() << "fileName : " << strFileName;
    // tmpFile.remove();
}
else
{
    qCritical() << "failed to write temporary file";
}

        Примечание: Чтобы проверить эффект, мы использовали setAutoRemove(false).Если вам нужно удалить временный файл после использования, вы можете включить режим автоматического удаления: setAutoRemove(true), или удалить его вручную: tmpFile. удалять().

3. Настройте класс QTemporaryFile.

class CTest; // 声明

class EnFile
    {
    public:
    EnFile() {};
    ~EnFile() { release(); };

    void release() 
    {
        if (QFile(mFilePath).exists())
            QFile(mFilePath).remove();
    mFilePath = "";
    };

    QString path() { return mFilePath; }

    private:
    QString mFilePath;
        
    void createCachePath() 
    {
        mFilePath = QDir::cleanPath(QDir::tempPath() + QDir::separator() + "b331a2f5652bb73f.temp");
    QTemporaryFile tFile(mFilePath);
        if (!tFile.open())
        {
            QString cachePath = QDir::homePath() + "/.cache/";
            QDir dir(cachePath);
            if (!dir.exists())
                dir.mkdir(cachePath);
            mFilePath = QDir::cleanPath(cachePath + QDir::separator() + "b331a2f5652bb73f.temp");
        }
   };
    friend class CTest;
//友元类,操作createCachePath()函数
};

4. Класс QTemporaryDir

QTemporaryDir dir("logs");
if (dir.isValid())
{
    // dir.path() returns the unique directory path
    qDebug() << "temp dir = " << dir.path();
}

1. Как читать и записывать временные файлы в системе Windows

Как читать и записывать временные файлы в Windows system-51CTO.COM

2. Значение параметров CreateFile в Windows

Как использовать функцию CreateFile для создания нового файла в операционной системе Windows? -Шэньчжэнь Чуньхэ Шэнхуэй

3. Операции с каталогом файлов (QCoreApplication, QFile, QFileInfo, QDir, QTemporaryDir/File, QFileSystemWatcher)

Qt: 42 --- Операции с каталогом файлов (QCoreApplication, QFile, QFileInfo, QDir, QTemporaryDir/File, QFileSystemWatcher)_51CTO каталог файлов blog_qt

Guess you like

Origin blog.csdn.net/weixin_34910922/article/details/132528524