424 if (d->fileName.isEmpty() &&
425 !
static_cast<QFSFileEngine *>(d->engine())->isUnnamedFile()) {
426 qWarning(
"QFile::remove: Empty or null file name");
431 if (error() == QFile::NoError) {
432 if (d->engine()->remove()) {
436 d->setError(QFile::RemoveError, d->fileEngine->errorString());
511 if (d->fileName.isEmpty() &&
512 !
static_cast<QFSFileEngine *>(d->engine())->isUnnamedFile()) {
513 qWarning(
"QFile::remove: Empty or null file name");
518 if (error() == QFile::NoError) {
519 QFileSystemEntry fileEntry(d->fileName);
520 QFileSystemEntry trashEntry;
522 if (QFileSystemEngine::moveFileToTrash(fileEntry, trashEntry, error)) {
523 setFileName(trashEntry.filePath());
527 d->setError(QFile::RenameError, error.toString());
577QFile::rename(
const QString &newName)
582 if (fileName().isEmpty()) {
583 qWarning(
"QFile::rename: Empty or null file name");
586 if (d->fileName == newName) {
587 d->setError(QFile::RenameError, tr(
"Destination file is the same file."));
591 d->setError(QFile::RenameError, tr(
"Source file does not exist."));
597 auto targetEngine = QFileSystemEngine::createLegacyEngine(newName);
602 bool changingCase =
false;
603 QByteArray targetId = QFileSystemEngine::id(QFileSystemEntry(newName));
604 if (!targetId.isNull()) {
605 QByteArray fileId = d->fileEngine ?
606 d->fileEngine->id() :
607 QFileSystemEngine::id(QFileSystemEntry(d->fileName));
608 changingCase = (fileId == targetId && d->fileName.compare(newName, Qt::CaseInsensitive) == 0);
610 d->setError(QFile::RenameError, tr(
"Destination file exists"));
614#if defined(Q_OS_LINUX) && QT_CONFIG(temporaryfile)
617 QTemporaryFileName tfn(d->fileName);
618 QFileSystemEntry src(d->fileName);
620 for (
int attempt = 0; attempt < 16; ++attempt) {
621 QFileSystemEntry tmp(tfn.generateNext(), QFileSystemEntry::FromNativePath());
624 if (!QFileSystemEngine::renameFile(src, tmp, error))
628 if (QFileSystemEngine::renameFile(tmp, QFileSystemEntry(newName), error)) {
629 d->fileEngine->setFileName(newName);
630 d->fileName = newName;
636 if (QFileSystemEngine::renameFile(tmp, src, error2))
640 d->setError(QFile::RenameError,
641 tr(
"Error while renaming: %1").arg(error.toString())
643 + tr(
"Unable to restore from %1: %2").
644 arg(QDir::toNativeSeparators(tmp.filePath()), error2.toString()));
647 d->setError(QFile::RenameError,
648 tr(
"Error while renaming: %1").arg(error.toString()));
654 if (error() == QFile::NoError) {
655 if (changingCase ? d->engine()->renameOverwrite(newName) : d->engine()->rename(newName)) {
658 d->fileEngine->setFileName(newName);
659 d->fileName = newName;
666 d->setError(QFile::RenameError, d->fileEngine->errorString());
670 if (isSequential()) {
671 d->setError(QFile::RenameError, tr(
"Will not rename sequential file using block copy"));
675#if QT_CONFIG(temporaryfile)
677 if (d->copy(newName)) {
680 d->setError(QFile::RenameError, tr(
"Cannot remove source file: %1").arg(errorString()));
683 out.setPermissions(ReadUser | WriteUser);
687 d->fileEngine->setFileName(newName);
689 setFileName(newName);
693 d->setError(QFile::RenameError, errorString());
697 d->setError(QFile::RenameError, d->fileEngine->errorString());
801 setError(QFile::CopyError, QFile::tr(
"Cannot open for output: %1").arg(out.errorString()));
918bool QFile::open(OpenMode mode)
922 return file_already_open(*
this);
924 if (mode & (Append | NewOnly))
927 if ((mode & (ReadOnly | WriteOnly)) == 0) {
928 qWarning(
"QIODevice::open: File access not specified");
933 if (d->engine()->open(mode | QIODevice::Unbuffered)) {
934 QIODevice::open(mode);
939 QFile::FileError err = d->fileEngine->error();
940 if (err == QFile::UnspecifiedError)
941 err = QFile::OpenError;
942 d->setError(err, d->fileEngine->errorString());
1033bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
1037 return file_already_open(*
this);
1039 if (mode & (Append | NewOnly))
1042 if ((mode & (ReadOnly | WriteOnly)) == 0) {
1043 qWarning(
"QFile::open: File access not specified");
1048 if (d->openExternalFile(mode | Unbuffered, fh, handleFlags)) {
1049 QIODevice::open(mode);
1050 if (!(mode & Append) && !isSequential()) {
1051 qint64 pos = (qint64)QT_FTELL(fh);
1054 QIODevice::seek(pos);
1085bool QFile::open(
int fd, OpenMode mode, FileHandleFlags handleFlags)
1089 return file_already_open(*
this);
1091 if (mode & (Append | NewOnly))
1094 if ((mode & (ReadOnly | WriteOnly)) == 0) {
1095 qWarning(
"QFile::open: File access not specified");
1100 if (d->openExternalFile(mode | Unbuffered, fd, handleFlags)) {
1101 QIODevice::open(mode);
1102 if (!(mode & Append) && !isSequential()) {
1103 qint64 pos = (qint64)QT_LSEEK(fd, QT_OFF_T(0), SEEK_CUR);
1106 QIODevice::seek(pos);