- Timestamp:
- Nov 28, 2009, 5:20:07 PM (16 years ago)
- Location:
- trunk/src/corelib/io
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/corelib/io/qdir.cpp
r172 r355 732 732 { 733 733 Q_D(const QDir); 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 734 779 if (isAbsolutePath(fileName)) 735 780 return fileName; … … 753 798 } 754 799 return ret; 800 801 755 802 } 756 803 -
trunk/src/corelib/io/qfileinfo.cpp
r172 r355 586 586 drive letter, except for network shares that are not mapped to a 587 587 drive letter, in which case the path will begin '//sharename/'. 588 QFileInfo will uppercase drive letters. Note that QDir does not do589 this. The code snippet below shows this.588 QFileInfo will uppercase drive letters. Note that QDir does not 589 this. The code snippet below shows this. 590 590 591 591 \snippet doc/src/snippets/code/src_corelib_io_qfileinfo.cpp newstuff -
trunk/src/corelib/io/qfsfileengine_os2.cpp
r177 r355 650 650 static bool isRelativePath(const QString &path) 651 651 { 652 return !(path.startsWith(QLatin1Char('/')) 653 || (path.length() >= 2 654 && ((path.at(0).isLetter() && path.at(1) == QLatin1Char(':')) 655 || (path.at(0) == QLatin1Char('/') && path.at(1) == QLatin1Char('/'))))); // drive, e.g. a: 652 // On OS/2, "A:bbb.txt" and "/ccc.dat" are relative paths 653 return !(path.startsWith(QLatin1String("//")) || 654 (path.length() >= 2 && path.at(0).isLetter() && 655 path.at(1) == QLatin1Char(':') && 656 // we treat "D:" as absolute while "D:aaa" as relative 657 (path.length() == 2 || path.at(2) == QLatin1Char('/')))); 656 658 } 657 659 … … 686 688 } else if(file == AbsoluteName || file == AbsolutePathName) { 687 689 QString ret; 688 689 if (!isRelativePath()) { 690 if (d->filePath.size() > 2 && d->filePath.at(1) == QLatin1Char(':') 691 && d->filePath.at(2) != QLatin1Char('/') || // It's a drive-relative path, so Z:a.txt -> Z:\currentpath\a.txt 692 d->filePath.startsWith(QLatin1Char('/')) // It's a absolute path to the current drive, so \a.txt -> Z:\a.txt 693 ) { 690 if (isRelativePath()) { 691 if ((d->filePath.size() > 2 && d->filePath.at(1) == QLatin1Char(':') && 692 d->filePath.at(2) != QLatin1Char('/')) || // path relative to the current dir of the given drive, so Z:a.txt -> Z:\currentpath\a.txt 693 (d->filePath.startsWith(QLatin1Char('/')))) { // path relative to the root of the current drive, so \a.txt -> Z:\a.txt 694 694 char buf[PATH_MAX+1]; 695 695 strcpy(buf, QFile::encodeName(d->filePath).constData()); 696 696 _abspath(buf, buf, sizeof(buf)); 697 ret = QFile::decodeName(buf); 697 ret = QDir::cleanPath(QFile::decodeName(buf)); 698 if (::isRelativePath(ret)) { 699 // still relative, this means we have "Z:aaa" but there is no such drive Z: 700 // just assume root is the current dir on Z: 701 Q_ASSERT(ret.at(1) == QLatin1Char(':')); 702 ret.insert(2, QLatin1Char('/')); 703 } 698 704 } else { 699 ret = d->filePath;705 ret = ; 700 706 } 701 707 } else { 702 ret = QDir::cleanPath(QDir::currentPath() + QLatin1Char('/') + d->filePath);708 ret = ; 703 709 } 704 710 705 711 // The path should be absolute at this point. 706 // From the docs : 707 // Absolute paths begin with the directory separator "/" 708 // (optionally preceded by a drive specification under Windows). 709 if (ret.at(0) != QLatin1Char('/')) { 712 // On OS/2, the absolute path always contains a "X:/" at the begining 713 // where X is the drive letter, or "//" if it's a network share 714 if (!ret.startsWith("//")) { 710 715 Q_ASSERT(ret.length() >= 2); 711 716 Q_ASSERT(ret.at(0).isLetter()); 712 717 Q_ASSERT(ret.at(1) == QLatin1Char(':')); 718 719 720 721 722 723 713 724 714 725 // Force uppercase drive letters. … … 718 729 if (file == AbsolutePathName) { 719 730 int slash = ret.lastIndexOf(QLatin1Char('/')); 720 if (slash < 0) 721 return ret; 722 else if (ret.at(0) != QLatin1Char('/') && slash == 2) 723 return ret.left(3); // include the slash 724 else 725 return ret.left(slash > 0 ? slash : 1); 731 if (!ret.startsWith("//")) { 732 Q_ASSERT(slash >= 2); 733 if (slash == 2) 734 ret = ret.left(3); // include the slash if it's "X:/" 735 else 736 ret = ret.left(slash); 737 } else { 738 Q_ASSERT(slash >= 1); 739 if (slash == 1) 740 ret = ret.left(3); // include the slash if it's "//" 741 else 742 ret = ret.left(slash); 743 } 726 744 } 727 745 return ret; … … 733 751 if (!ret.isEmpty() && file == CanonicalPathName) { 734 752 int slash = ret.lastIndexOf(QLatin1Char('/')); 735 if (slash == -1) 736 ret = QDir::currentPath(); 737 else if (slash == 0) 738 ret = QLatin1String("/"); 739 ret = ret.left(slash); 753 if (!ret.startsWith("//")) { 754 Q_ASSERT(slash >= 2); 755 if (slash == 2) 756 ret = ret.left(3); // include the slash if it's "X:/" 757 else 758 ret = ret.left(slash); 759 } else { 760 Q_ASSERT(slash >= 1); 761 if (slash == 1) 762 ret = ret.left(3); // include the slash if it's "//" 763 else 764 ret = ret.left(slash); 765 } 740 766 } 741 767 return ret; … … 748 774 QString target = QDir::fromNativeSeparators(QFile::decodeName(QByteArray(buf))); 749 775 QString ret; 750 if (!::isRelativePath(target)) { 751 if (target.size() > 2 && target.at(1) == QLatin1Char(':') 752 && target.at(2) != QLatin1Char('/') || // It's a drive-relative path, so Z:a.txt -> Z:\currentpath\a.txt 753 target.startsWith(QLatin1Char('/')) // It's a absolute path to the current drive, so \a.txt -> Z:\a.txt 754 ) { 776 if (::isRelativePath(target)) { 777 if ((target.size() > 2 && target.at(1) == QLatin1Char(':') && 778 target.at(2) != QLatin1Char('/')) || // path relative to the current dir of the given drive, so Z:a.txt -> Z:\currentpath\a.txt 779 (target.startsWith(QLatin1Char('/')))) { // path relative to the root of the current drive, so \a.txt -> Z:\a.txt 755 780 char buf[PATH_MAX+1]; 756 781 strcpy(buf, QFile::encodeName(target).constData()); 757 782 _abspath(buf, buf, sizeof(buf)); 758 ret = QFile::decodeName(buf); 783 ret = QDir::cleanPath(QFile::decodeName(buf)); 784 if (::isRelativePath(ret)) { 785 // still relative, this means we have "Z:aaa" but there is no such drive Z: 786 // just assume root is the current dir on Z: 787 Q_ASSERT(ret.at(1) == QLatin1Char(':')); 788 ret.insert(2, QLatin1Char('/')); 789 } 759 790 } else { 760 ret = target; 791 if (S_ISDIR(d->st.st_mode)) { 792 QDir parent(d->filePath); 793 parent.cdUp(); 794 ret = parent.path(); 795 if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/'))) 796 ret += QLatin1Char('/'); 797 } 798 ret += target; 799 800 if (::isRelativePath(ret)) { 801 if (!isRelativePath()) { 802 ret.prepend(d->filePath.left(d->filePath.lastIndexOf(QLatin1Char('/'))) 803 + QLatin1Char('/')); 804 } else { 805 ret.prepend(QDir::currentPath() + QLatin1Char('/')); 806 } 807 } 808 ret = QDir::cleanPath(ret); 809 if (ret.size() > 1 && ret.endsWith(QLatin1Char('/'))) 810 ret.chop(1); 761 811 } 762 812 } else { 763 if (S_ISDIR(d->st.st_mode)) { 764 QDir parent(d->filePath); 765 parent.cdUp(); 766 ret = parent.path(); 767 if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/'))) 768 ret += QLatin1Char('/'); 769 } 770 ret += target; 771 772 if (::isRelativePath(ret)) { 773 if (!isRelativePath()) { 774 ret.prepend(d->filePath.left(d->filePath.lastIndexOf(QLatin1Char('/'))) 775 + QLatin1Char('/')); 776 } else { 777 ret.prepend(QDir::currentPath() + QLatin1Char('/')); 778 } 779 } 780 ret = QDir::cleanPath(ret); 781 if (ret.size() > 1 && ret.endsWith(QLatin1Char('/'))) 782 ret.chop(1); 813 ret = target; 783 814 } 784 815 816 785 817 // The path should be absolute at this point. 786 // From the docs : 787 // Absolute paths begin with the directory separator "/" 788 // (optionally preceded by a drive specification under Windows). 789 if (ret.at(0) != QLatin1Char('/')) { 818 // On OS/2, the absolute path always contains a "X:/" at the begining 819 // where X is the drive letter, or "//" if it's a network share 820 if (!ret.startsWith("//")) { 790 821 Q_ASSERT(ret.length() >= 2); 791 822 Q_ASSERT(ret.at(0).isLetter()); 792 823 Q_ASSERT(ret.at(1) == QLatin1Char(':')); 824 825 826 827 828 829 793 830 794 831 // Force uppercase drive letters.
Note:
See TracChangeset
for help on using the changeset viewer.