?? qfsfileengine_unix.cpp
字號:
return is_link;}#if defined (Q_WS_MAC)bool QFSFileEnginePrivate::isMacHidden(const QString &path) const{ OSErr err = noErr; FSRef fsRef; err = FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(path)).data(), &fsRef, 0); if (err != noErr) return false; FSCatalogInfo catInfo; err = FSGetCatalogInfo(&fsRef, kFSCatInfoFinderInfo, &catInfo, NULL, NULL, NULL); if (err != noErr) return false; FileInfo * const fileInfo = reinterpret_cast<FileInfo*>(&catInfo.finderInfo); bool result = (fileInfo->finderFlags & kIsInvisible); return result;}#endif/*! \reimp*/QAbstractFileEngine::FileFlags QFSFileEngine::fileFlags(FileFlags type) const{ Q_D(const QFSFileEngine); // Force a stat, so that we're guaranteed to get up-to-date results if (type & QAbstractFileEngine::FileFlag(0x1000000)) { // QDir::Refresh d->tried_stat = 0; d->need_lstat = 1; } QAbstractFileEngine::FileFlags ret = 0; bool exists = d->doStat(); if (!exists && !d->isSymlink()) return ret; if (exists && (type & PermsMask)) { if(d->st.st_mode & S_IRUSR) ret |= ReadOwnerPerm; if(d->st.st_mode & S_IWUSR) ret |= WriteOwnerPerm; if(d->st.st_mode & S_IXUSR) ret |= ExeOwnerPerm; if(d->st.st_mode & S_IRUSR) ret |= ReadUserPerm; if(d->st.st_mode & S_IWUSR) ret |= WriteUserPerm; if(d->st.st_mode & S_IXUSR) ret |= ExeUserPerm; if(d->st.st_mode & S_IRGRP) ret |= ReadGroupPerm; if(d->st.st_mode & S_IWGRP) ret |= WriteGroupPerm; if(d->st.st_mode & S_IXGRP) ret |= ExeGroupPerm; if(d->st.st_mode & S_IROTH) ret |= ReadOtherPerm; if(d->st.st_mode & S_IWOTH) ret |= WriteOtherPerm; if(d->st.st_mode & S_IXOTH) ret |= ExeOtherPerm; } if(type & TypesMask) {#if !defined(QWS) && defined(Q_OS_MAC) bool foundAlias = false; { FSRef fref; if(FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(d->file)).data(), &fref, NULL) == noErr) { Boolean isAlias, isFolder; if(FSIsAliasFile(&fref, &isAlias, &isFolder) == noErr && isAlias) { foundAlias = true; ret |= LinkType; } } } if(!foundAlias)#endif { if ((type & LinkType) && d->isSymlink()) ret |= LinkType; if (exists && (d->st.st_mode & S_IFMT) == S_IFREG) ret |= FileType; else if (exists && (d->st.st_mode & S_IFMT) == S_IFDIR) ret |= DirectoryType; } } if(type & FlagsMask) { ret |= LocalDiskFlag; if (exists) ret |= ExistsFlag; if(fileName(BaseName)[0] == QLatin1Char('.')#if defined(Q_WS_MAC) || d->isMacHidden(d->file)#endif ) ret |= HiddenFlag; if(d->file == QLatin1String("/")) ret |= RootFlag; } return ret;}QString QFSFileEngine::fileName(FileName file) const{ Q_D(const QFSFileEngine); if(file == BaseName) { int slash = d->file.lastIndexOf(QLatin1Char('/')); if(slash != -1) return d->file.mid(slash + 1); } else if(file == PathName) { int slash = d->file.lastIndexOf(QLatin1Char('/')); if(slash == -1) return QLatin1String("."); else if(!slash) return QLatin1String("/"); return d->file.left(slash); } else if(file == AbsoluteName || file == AbsolutePathName) { QString ret; if(d->file.isEmpty() || !d->file.startsWith(QLatin1Char('/'))) ret = QDir::currentPath(); if(!d->file.isEmpty() && d->file != QLatin1String(".")) { if(!ret.isEmpty() && !ret.endsWith(QLatin1Char('/'))) ret += QLatin1Char('/'); ret += d->file; } if (ret == QLatin1String("/")) return ret; bool isDir = ret.endsWith(QLatin1Char('/')); ret = QDir::cleanPath(ret); if (isDir) ret += QLatin1String("/"); if(file == AbsolutePathName) { int slash = ret.lastIndexOf(QLatin1Char('/')); if(slash == -1) return QDir::currentPath(); else if(!slash) return QLatin1String("/"); return ret.left(slash); } return ret; } else if(file == CanonicalName || file == CanonicalPathName) { char cur[PATH_MAX+1]; if(::getcwd(cur, PATH_MAX)) { QString ret; char real[PATH_MAX+1]; // need the cast for old solaris versions of realpath that doesn't take // a const char*. if(::realpath(QFile::encodeName(d->file).data(), real)) ret = QFile::decodeName(QByteArray(real)); ::chdir(cur); // always make sure we go back to the current dir //check it QT_STATBUF st; if(QT_STAT(QFile::encodeName(ret), &st) != 0) ret = QString(); if(!ret.isEmpty() && file == CanonicalPathName) { int slash = ret.lastIndexOf(QLatin1Char('/')); if(slash == -1) return QDir::currentPath(); else if(!slash) return QLatin1String("/"); return ret.left(slash); } return ret; } if(file == CanonicalPathName) return fileName(AbsolutePathName); return fileName(AbsoluteName); } else if(file == LinkName) { if (d->isSymlink()) { char s[PATH_MAX+1]; int len = readlink(QFile::encodeName(d->file), s, PATH_MAX); if(len > 0) { QString ret; if (S_ISDIR(d->st.st_mode) && s[0] != '/') { QDir parent(d->file); parent.cdUp(); ret = parent.path(); if (!ret.isEmpty() && !ret.endsWith(QLatin1Char('/'))) ret += QLatin1Char('/'); } s[len] = '\0'; ret += QFile::decodeName(QByteArray(s)); if (!ret.startsWith(QLatin1Char('/'))) { if (d->file.startsWith(QLatin1Char('/'))) { ret.prepend(d->file.left(d->file.lastIndexOf(QLatin1Char('/'))) + QLatin1Char('/')); } else { ret.prepend(QDir::currentPath() + QLatin1Char('/')); } } ret = QDir::cleanPath(ret); if (ret.size() > 1 && ret.endsWith(QLatin1Char('/'))) ret.chop(1); return ret; } }#if !defined(QWS) && defined(Q_OS_MAC) { FSRef fref; if(FSPathMakeRef((const UInt8 *)QFile::encodeName(QDir::cleanPath(d->file)).data(), &fref, 0) == noErr) { Boolean isAlias, isFolder; if(FSResolveAliasFile(&fref, true, &isFolder, &isAlias) == noErr && isAlias) { AliasHandle alias; if(FSNewAlias(0, &fref, &alias) == noErr && alias) { CFStringRef cfstr; if(FSCopyAliasInfo(alias, 0, 0, &cfstr, 0, 0) == noErr) return QCFString::toQString(cfstr); } } } }#endif return QString(); } return d->file;}bool QFSFileEngine::isRelativePath() const{ Q_D(const QFSFileEngine); int len = d->file.length(); if(len == 0) return true; return d->file[0] != QLatin1Char('/');}uint QFSFileEngine::ownerId(FileOwner own) const{ Q_D(const QFSFileEngine); static const uint nobodyID = (uint) -2; if(d->doStat()) { if(own == OwnerUser) return d->st.st_uid; else return d->st.st_gid; } return nobodyID;}QString QFSFileEngine::owner(FileOwner own) const{#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) QVarLengthArray<char, 1024> buf(sysconf(_SC_GETPW_R_SIZE_MAX));#endif if(own == OwnerUser) { struct passwd *pw = 0;#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) struct passwd entry; getpwuid_r(ownerId(own), &entry, buf.data(), buf.size(), &pw);#else pw = getpwuid(ownerId(own));#endif if(pw) return QFile::decodeName(QByteArray(pw->pw_name)); } else if(own == OwnerGroup) { struct group *gr = 0;#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) buf.resize(sysconf(_SC_GETGR_R_SIZE_MAX)); struct group entry; getgrgid_r(ownerId(own), &entry, buf.data(), buf.size(), &gr);#else gr = getgrgid(ownerId(own));#endif if(gr) return QFile::decodeName(QByteArray(gr->gr_name)); } return QString();}bool QFSFileEngine::setPermissions(uint perms){ Q_D(QFSFileEngine); mode_t mode = 0; if(perms & ReadOwnerPerm) mode |= S_IRUSR; if(perms & WriteOwnerPerm) mode |= S_IWUSR; if(perms & ExeOwnerPerm) mode |= S_IXUSR; if(perms & ReadUserPerm) mode |= S_IRUSR; if(perms & WriteUserPerm) mode |= S_IWUSR; if(perms & ExeUserPerm) mode |= S_IXUSR; if(perms & ReadGroupPerm) mode |= S_IRGRP; if(perms & WriteGroupPerm) mode |= S_IWGRP; if(perms & ExeGroupPerm) mode |= S_IXGRP; if(perms & ReadOtherPerm) mode |= S_IROTH; if(perms & WriteOtherPerm) mode |= S_IWOTH; if(perms & ExeOtherPerm) mode |= S_IXOTH; if(d->fd != -1) return !fchmod(d->fd, mode); const QByteArray file = QFile::encodeName(d->file); return !::chmod(file.data(), mode);}bool QFSFileEngine::setSize(qint64 size){ Q_D(QFSFileEngine); if(d->fd != -1) return !QT_FTRUNCATE(d->fd, size); const QByteArray file = QFile::encodeName(d->file); return !QT_TRUNCATE(file.data(), size);}QDateTime QFSFileEngine::fileTime(FileTime time) const{ Q_D(const QFSFileEngine); QDateTime ret; if(d->doStat()) { if(time == CreationTime) ret.setTime_t(d->st.st_ctime ? d->st.st_ctime : d->st.st_mtime); else if(time == ModificationTime) ret.setTime_t(d->st.st_mtime); else if(time == AccessTime) ret.setTime_t(d->st.st_atime); } return ret;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -