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) {
821 qint64 in = q->read(block,
sizeof(block));
826 QString s = std::move(errorString);
828 setError(QFile::CopyError, std::move(s));
831 if (in != out.write(block, in)) {
833 setError(QFile::CopyError, QFile::tr(
"Failure to write block: %1")
834 .arg(out.errorString()));
840 out.setPermissions(permissions);
846 setError(out.error(), out.errorString());
851
852
853
854
855
856
857
858
861QFile::copy(
const QString &newName, std::optional<QFileDevice::Permissions> perm)
864 if (fileName().isEmpty()) {
865 qWarning(
"QFile::copy: Empty or null file name");
868 if (QFile::exists(newName)) {
872 d->setError(QFile::CopyError, tr(
"Destination file exists"));
877 if (error() == QFile::NoError)
878 return d->copy(newName, perm ? *perm : permissions());
883
884
885
886
887
888
889
890
893QFile::copy(
const QString &fileName,
const QString &newName,
894 std::optional<QFileDevice::Permissions> perm)
896 return QFile(fileName).copy(newName, perm);
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919bool QFile::open(OpenMode mode)
923 return file_already_open(*
this);
925 if (mode & (Append | NewOnly))
928 if ((mode & (ReadOnly | WriteOnly)) == 0) {
929 qWarning(
"QIODevice::open: File access not specified");
934 if (d->engine()->open(mode | QIODevice::Unbuffered)) {
935 QIODevice::open(mode);
940 QFile::FileError err = d->fileEngine->error();
941 if (err == QFile::UnspecifiedError)
942 err = QFile::OpenError;
943 d->setError(err, d->fileEngine->errorString());
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964bool QFile::open(OpenMode mode, QFile::Permissions permissions)
968 return file_already_open(*
this);
970 if (mode & (Append | NewOnly))
973 if ((mode & (ReadOnly | WriteOnly)) == 0) {
974 qWarning(
"QIODevice::open: File access not specified");
979 if (d->engine()->open(mode | QIODevice::Unbuffered, permissions)) {
980 QIODevice::open(mode);
985 QFile::FileError err = d->fileEngine->error();
986 if (err == QFile::UnspecifiedError)
987 err = QFile::OpenError;
988 d->setError(err, d->fileEngine->errorString());
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
1033
1034bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
1038 return file_already_open(*
this);
1040 if (mode & (Append | NewOnly))
1043 if ((mode & (ReadOnly | WriteOnly)) == 0) {
1044 qWarning(
"QFile::open: File access not specified");
1049 if (d->openExternalFile(mode | Unbuffered, fh, handleFlags)) {
1050 QIODevice::open(mode);
1051 if (!(mode & Append) && !isSequential()) {
1052 qint64 pos = (qint64)QT_FTELL(fh);
1055 QIODevice::seek(pos);
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086bool QFile::open(
int fd, OpenMode mode, FileHandleFlags handleFlags)
1090 return file_already_open(*
this);
1092 if (mode & (Append | NewOnly))
1095 if ((mode & (ReadOnly | WriteOnly)) == 0) {
1096 qWarning(
"QFile::open: File access not specified");
1101 if (d->openExternalFile(mode | Unbuffered, fd, handleFlags)) {
1102 QIODevice::open(mode);
1103 if (!(mode & Append) && !isSequential()) {
1104 qint64 pos = (qint64)QT_LSEEK(fd, QT_OFF_T(0), SEEK_CUR);
1107 QIODevice::seek(pos);