Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Qt中管理文件(替换、删除…)?_C++_Qt - Fatal编程技术网

C++ 如何在Qt中管理文件(替换、删除…)?

C++ 如何在Qt中管理文件(替换、删除…)?,c++,qt,C++,Qt,我有一个带有备份副本的文本文件:备份副本的名称与扩展名的最后一个字符相同,只有一个“2”(例如:Original:Myfile.txt-backup:Myfile.txt2)。 有时我需要用备份替换原来的;我做了以下工作: QFile BackupFile("Myfile.txt2"); // backup copy QString nameFile = BackupFile.fileName();// name of backup copy of file nameFile

我有一个带有备份副本的文本文件:备份副本的名称与扩展名的最后一个字符相同,只有一个“2”(例如:Original:Myfile.txt-backup:Myfile.txt2)。 有时我需要用备份替换原来的;我做了以下工作:

QFile BackupFile("Myfile.txt2");           // backup copy
QString nameFile = BackupFile.fileName();// name of backup copy of file
nameFile.chop(1);                      // remove the last letter of file name, so nameFile now is the same of Original file
QFile originalFile(nameFile);             // Original copy
originalFile.remove();                     // delete the original file
BackupFile.rename(nameFile);            // rename the backup file as original
BackupFile.close();                      // close the file
这是可行的,但似乎太复杂了。我想要简单点的


你有什么建议吗?

我认为这段代码可以是一个简单的方法。但是,您应该为错误情况添加代码,例如“检查备份文件是否存在”等

auto ReplaceWithBackup = []( QString& backupName ) -> bool
{
    QString originName = backupName;
    originName.chop( 1 );

    if ( QFile::exists( originName ) )
    {
        QFile::remove( originName );
    }

    return QFile::rename( backupName, originName );
};

if ( ReplaceWithBackup( "Myfile.txt2") == false )
{
    // error
}

如果文件位于同一目录中,则可以使用QDir::rename。否则,需要读取一个文件并写入另一个文件。这是我对第一个案例的看法

// Generate some test data
{
    QFile bf( "Myfile.txt2" );
    bf.open(QIODevice::WriteOnly);
    bf.write("Backup data");
    QFile( "Myfile.txt" ).open(QIODevice::WriteOnly);
}

//Assume you know which back-up file to restore
QString backupFn("Myfile.txt2"); 

//Actual code
QString origFn = backupFn.mid( 0, backupFn.size()-1 ); //"guess" the original file name. 
QFile::remove( origFn );  //Use static version to delete file by name (No QFile instance required)
QDir().rename(backupFn,origFn);

但是,每一行都需要进行多次检查和验证,例如,提供的备份文件名是否为有效的备份名,是否成功删除/重命名,等等。

为什么必须首先重命名备份?您可能希望同时打开两个文件并将其中一个文件的内容复制到另一个文件中,但这种方法并不比您使用的方法好,特别是在大文件的情况下。您是指
QString originalName=backupName?我的意思是:auto ReplaceWithBackup=[](QString&backupName)->bool似乎与我的编译器不兼容…我只是为了可读性使用了lambda,但是您可以使用普通函数代替它。