275
276
277
278
279QString QFile::fileName()
const
282 return d->engine()->fileName(QAbstractFileEngine::DefaultName);
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
304QFile::setFileName(
const QString &name)
308 file_already_open(*
this,
"setFileName");
311 d->fileEngine.reset();
316
317
318
319
320
321
322
325
326
327
328
329
330
331
332
333
336
337
338
339
340
341
344
345
346
347
348
349
350
357 return d->engine()->fileFlags(QAbstractFileEngine::FlagsMask
358 | QAbstractFileEngine::Refresh).testAnyFlag(QAbstractFileEngine::ExistsFlag);
362
363
364
365
366
367
370QFile::exists(
const QString &fileName)
372 return QFileInfo::exists(fileName);
376
377
378
379
380
381
382
383
384
385
386
387
388
389QString QFile::symLinkTarget()
const
392 return d->engine()->fileName(QAbstractFileEngine::AbsoluteLinkTarget);
396
397
398
399
400
401
402
403
404
405
406QString QFile::symLinkTarget(
const QString &fileName)
408 return QFileInfo(fileName).symLinkTarget();
412
413
414
415
416
417
418
419
420
426 if (d->fileName.isEmpty() &&
427 !
static_cast<QFSFileEngine *>(d->engine())->isUnnamedFile()) {
428 qWarning(
"QFile::remove: Empty or null file name");
433 if (error() == QFile::NoError) {
434 if (d->engine()->remove()) {
438 d->setError(QFile::RemoveError, d->fileEngine->errorString());
444
445
446
447
448
449
450
451
452
455QFile::remove(
const QString &fileName)
457 return QFile(fileName).remove();
461
462
463
464
465
466
467
468
469
470
471bool QFile::supportsMoveToTrash()
473 return QFileSystemEngine::supportsMoveFileToTrash();
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
514 if (d->fileName.isEmpty() &&
515 !
static_cast<QFSFileEngine *>(d->engine())->isUnnamedFile()) {
516 qWarning(
"QFile::remove: Empty or null file name");
521 if (error() == QFile::NoError) {
522 QFileSystemEntry fileEntry(d->fileName);
523 QFileSystemEntry trashEntry;
525 if (QFileSystemEngine::moveFileToTrash(fileEntry, trashEntry, error)) {
526 setFileName(trashEntry.filePath());
530 d->setError(QFile::RenameError, error.toString());
536
537
538
539
540
541
542
543
544
545
546
547
548
549
551QFile::moveToTrash(
const QString &fileName, QString *pathInTrash)
553 QFile file(fileName);
554 if (file.moveToTrash()) {
556 *pathInTrash = file.fileName();
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
580QFile::rename(
const QString &newName)
585 if (fileName().isEmpty()) {
586 qWarning(
"QFile::rename: Empty or null file name");
589 if (d->fileName == newName) {
590 d->setError(QFile::RenameError, tr(
"Destination file is the same file."));
594 d->setError(QFile::RenameError, tr(
"Source file does not exist."));
600 auto targetEngine = QFileSystemEngine::createLegacyEngine(newName);
605 bool changingCase =
false;
606 QByteArray targetId = QFileSystemEngine::id(QFileSystemEntry(newName));
607 if (!targetId.isNull()) {
608 QByteArray fileId = d->fileEngine ?
609 d->fileEngine->id() :
610 QFileSystemEngine::id(QFileSystemEntry(d->fileName));
611 changingCase = (fileId == targetId && d->fileName.compare(newName, Qt::CaseInsensitive) == 0);
613 d->setError(QFile::RenameError, tr(
"Destination file exists"));
617#if defined(Q_OS_LINUX) && QT_CONFIG(temporaryfile)
620 QTemporaryFileName tfn(d->fileName);
621 QFileSystemEntry src(d->fileName);
623 for (
int attempt = 0; attempt < 16; ++attempt) {
624 QFileSystemEntry tmp(tfn.generateNext(), QFileSystemEntry::FromNativePath());
627 if (!QFileSystemEngine::renameFile(src, tmp, error))
631 if (QFileSystemEngine::renameFile(tmp, QFileSystemEntry(newName), error)) {
632 d->fileEngine->setFileName(newName);
633 d->fileName = newName;
639 if (QFileSystemEngine::renameFile(tmp, src, error2))
643 d->setError(QFile::RenameError,
644 tr(
"Error while renaming: %1").arg(error.toString())
646 + tr(
"Unable to restore from %1: %2").
647 arg(QDir::toNativeSeparators(tmp.filePath()), error2.toString()));
650 d->setError(QFile::RenameError,
651 tr(
"Error while renaming: %1").arg(error.toString()));
657 if (error() == QFile::NoError) {
658 if (changingCase ? d->engine()->renameOverwrite(newName) : d->engine()->rename(newName)) {
661 d->fileEngine->setFileName(newName);
662 d->fileName = newName;
669 d->setError(QFile::RenameError, d->fileEngine->errorString());
673 if (isSequential()) {
674 d->setError(QFile::RenameError, tr(
"Will not rename sequential file using block copy"));
678#if QT_CONFIG(temporaryfile)
680 if (d->copy(newName, permissions())) {
683 d->setError(QFile::RenameError, tr(
"Cannot remove source file: %1").arg(errorString()));
686 out.setPermissions(ReadUser | WriteUser);
690 d->fileEngine->setFileName(newName);
692 setFileName(newName);
696 d->setError(QFile::RenameError, errorString());
700 d->setError(QFile::RenameError, d->fileEngine->errorString());
707
708
709
710
711
712
713
714
715
716
719QFile::rename(
const QString &oldName,
const QString &newName)
721 return QFile(oldName).rename(newName);
725
726
727
728
729
730
731
732
733
734
735
736
737
738
741QFile::link(
const QString &linkName)
744 if (fileName().isEmpty()) {
745 qWarning(
"QFile::link: Empty or null file name");
751 auto targetEngine = QFileSystemEngine::createLegacyEngine(linkName);
753 QFileInfo fi(linkName);
754 if (d->engine()->link(fi.absoluteFilePath())) {
758 d->setError(QFile::RenameError, d->fileEngine->errorString());
763
764
765
766
767
768
769
770
771
774QFile::link(
const QString &fileName,
const QString &linkName)
776 return QFile(fileName).link(linkName);
779#if QT_CONFIG(temporaryfile)
780bool QFilePrivate::copy(
const QString &newName, QFileDevice::Permissions permissions)
783 Q_ASSERT(error == QFile::NoError);
784 Q_ASSERT(!q->isOpen());
788 auto targetEngine = QFileSystemEngine::createLegacyEngine(newName);
792 if (engine()->copy(newName))
795 if (!q->open(QFile::ReadOnly | QFile::Unbuffered)) {
796 setError(QFile::CopyError, QFile::tr(
"Cannot open %1 for input").arg(fileName));
800 QSaveFile out(newName);
801 out.setDirectWriteFallback(
true);
802 if (!out.open(QIODevice::WriteOnly | QIODevice::Unbuffered)) {
804 setError(QFile::CopyError, QFile::tr(
"Cannot open for output: %1").arg(out.errorString()));
809 QAbstractFileEngine::TriStateResult r = engine()->cloneTo(out.d_func()->engine());
810 if (r == QAbstractFileEngine::TriStateResult::Failed) {
812 setError(QFile::CopyError, QFile::tr(
"Could not copy to %1: %2")
813 .arg(newName, engine()->errorString()));
817 while (r == QAbstractFileEngine::TriStateResult::NotSupported) {
820 qint64 in = q->read(block,
sizeof(block));
825 QString s = std::move(errorString);
827 setError(QFile::CopyError, std::move(s));
830 if (in != out.write(block, in)) {
832 setError(QFile::CopyError, QFile::tr(
"Failure to write block: %1")
833 .arg(out.errorString()));
839 out.setPermissions(permissions);
845 setError(out.error(), out.errorString());
850
851
852
853
854
855
856
857
860QFile::copy(
const QString &newName, std::optional<QFileDevice::Permissions> perm)
863 if (fileName().isEmpty()) {
864 qWarning(
"QFile::copy: Empty or null file name");
867 if (QFile::exists(newName)) {
871 d->setError(QFile::CopyError, tr(
"Destination file exists"));
876 if (error() == QFile::NoError)
877 return d->copy(newName, perm ? *perm : permissions());
882
883
884
885
886
887
888
889
892QFile::copy(
const QString &fileName,
const QString &newName,
893 std::optional<QFileDevice::Permissions> perm)
895 return QFile(fileName).copy(newName, perm);
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
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());
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963bool QFile::open(OpenMode mode, QFile::Permissions permissions)
967 return file_already_open(*
this);
969 if (mode & (Append | NewOnly))
972 if ((mode & (ReadOnly | WriteOnly)) == 0) {
973 qWarning(
"QIODevice::open: File access not specified");
978 if (d->engine()->open(mode | QIODevice::Unbuffered, permissions)) {
979 QIODevice::open(mode);
984 QFile::FileError err = d->fileEngine->error();
985 if (err == QFile::UnspecifiedError)
986 err = QFile::OpenError;
987 d->setError(err, d->fileEngine->errorString());
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
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);
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
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);