Blame qtools/qfileinfo.cpp

Packit Service 50c9f2
/****************************************************************************
Packit Service 50c9f2
** 
Packit Service 50c9f2
**
Packit Service 50c9f2
** Implementation of QFileInfo class
Packit Service 50c9f2
**
Packit Service 50c9f2
** Created : 950628
Packit Service 50c9f2
**
Packit Service 50c9f2
** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
Packit Service 50c9f2
**
Packit Service 50c9f2
** This file is part of the tools module of the Qt GUI Toolkit.
Packit Service 50c9f2
**
Packit Service 50c9f2
** This file may be distributed under the terms of the Q Public License
Packit Service 50c9f2
** as defined by Trolltech AS of Norway and appearing in the file
Packit Service 50c9f2
** LICENSE.QPL included in the packaging of this file.
Packit Service 50c9f2
**
Packit Service 50c9f2
** This file may be distributed and/or modified under the terms of the
Packit Service 50c9f2
** GNU General Public License version 2 as published by the Free Software
Packit Service 50c9f2
** Foundation and appearing in the file LICENSE.GPL included in the
Packit Service 50c9f2
** packaging of this file.
Packit Service 50c9f2
**
Packit Service 50c9f2
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
Packit Service 50c9f2
** licenses may use this file in accordance with the Qt Commercial License
Packit Service 50c9f2
** Agreement provided with the Software.
Packit Service 50c9f2
**
Packit Service 50c9f2
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
Packit Service 50c9f2
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Packit Service 50c9f2
**
Packit Service 50c9f2
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
Packit Service 50c9f2
**   information about Qt Commercial License Agreements.
Packit Service 50c9f2
** See http://www.trolltech.com/qpl/ for QPL licensing information.
Packit Service 50c9f2
** See http://www.trolltech.com/gpl/ for GPL licensing information.
Packit Service 50c9f2
**
Packit Service 50c9f2
** Contact info@trolltech.com if any conditions of this licensing are
Packit Service 50c9f2
** not clear to you.
Packit Service 50c9f2
**
Packit Service 50c9f2
**********************************************************************/
Packit Service 50c9f2
Packit Service 50c9f2
#include "qglobal.h"
Packit Service 50c9f2
Packit Service 50c9f2
#include "qfileinfo.h"
Packit Service 50c9f2
#include "qfiledefs_p.h"
Packit Service 50c9f2
#include "qdatetime.h"
Packit Service 50c9f2
#include "qdir.h"
Packit Service 50c9f2
Packit Service 50c9f2
extern bool qt_file_access( const QString& fn, int t );
Packit Service 50c9f2
Packit Service 50c9f2
// NOT REVISED
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  \class QFileInfo qfileinfo.h
Packit Service 50c9f2
  \brief The QFileInfo class provides system-independent file information.
Packit Service 50c9f2
Packit Service 50c9f2
  \ingroup io
Packit Service 50c9f2
Packit Service 50c9f2
  QFileInfo provides information about a file's name and position (path) in
Packit Service 50c9f2
  the file system, its access rights and whether it is a directory or a
Packit Service 50c9f2
  symbolic link.  Its size and last modified/read times are also available.
Packit Service 50c9f2
Packit Service 50c9f2
  To speed up performance QFileInfo caches information about the file. Since
Packit Service 50c9f2
  files can be changed by other users or programs, or even by other parts of
Packit Service 50c9f2
  the same program there is a function that refreshes the file information;
Packit Service 50c9f2
  refresh(). If you would rather like a QFileInfo to access the file system
Packit Service 50c9f2
  every time you request information from it, you can call the function
Packit Service 50c9f2
  setCaching( FALSE ).
Packit Service 50c9f2
Packit Service 50c9f2
  A QFileInfo can point to a file using either a relative or an absolute
Packit Service 50c9f2
  file path. Absolute file paths begin with the directory separator
Packit Service 50c9f2
  ('/') or a drive specification (not applicable to UNIX).
Packit Service 50c9f2
  Relative file names begin with a directory name or a file name and specify
Packit Service 50c9f2
  a path relative to the current directory. An example of
Packit Service 50c9f2
  an absolute path is the string "/tmp/quartz". A relative path might look like
Packit Service 50c9f2
  "src/fatlib". You can use the function isRelative() to check if a QFileInfo
Packit Service 50c9f2
  is using a relative or an absolute file path. You can call the function
Packit Service 50c9f2
  convertToAbs() to convert a relative QFileInfo to an absolute one.
Packit Service 50c9f2
Packit Service 50c9f2
  If you need to read and traverse directories, see the QDir class.
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Constructs a new empty QFileInfo.
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QFileInfo::QFileInfo()
Packit Service 50c9f2
{
Packit Service 50c9f2
    fic	  = 0;
Packit Service 50c9f2
    cache = TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Constructs a new QFileInfo that gives information about the given file.
Packit Service 50c9f2
  The string given can be an absolute or a relative file path.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa bool setFile(QString ), isRelative(), QDir::setCurrent(),
Packit Service 50c9f2
  QDir::isRelativePath()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QFileInfo::QFileInfo( const QString &file )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn	  = file;
Packit Service 50c9f2
    slashify( fn );
Packit Service 50c9f2
    fic	  = 0;
Packit Service 50c9f2
    cache = TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Constructs a new QFileInfo that gives information about \e file.
Packit Service 50c9f2
Packit Service 50c9f2
  If the file has a relative path, the QFileInfo will also have one.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa isRelative()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QFileInfo::QFileInfo( const QFile &file )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn	  = file.name();
Packit Service 50c9f2
    slashify( fn );
Packit Service 50c9f2
    fic	  = 0;
Packit Service 50c9f2
    cache = TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Constructs a new QFileInfo that gives information about the file
Packit Service 50c9f2
  named \e fileName in the directory \e d.
Packit Service 50c9f2
Packit Service 50c9f2
  If the directory has a relative path, the QFileInfo will also have one.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa isRelative()
Packit Service 50c9f2
*/
Packit Service 50c9f2
#ifndef QT_NO_DIR
Packit Service 50c9f2
QFileInfo::QFileInfo( const QDir &d, const QString &fileName )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn	  = d.filePath( fileName );
Packit Service 50c9f2
    slashify( fn );
Packit Service 50c9f2
    fic	  = 0;
Packit Service 50c9f2
    cache = TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
#endif
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Constructs a new QFileInfo that is a copy of \e fi.
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QFileInfo::QFileInfo( const QFileInfo &fi )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn = fi.fn;
Packit Service 50c9f2
    if ( fi.fic ) {
Packit Service 50c9f2
	fic = new QFileInfoCache;
Packit Service 50c9f2
	*fic = *fi.fic;
Packit Service 50c9f2
    } else {
Packit Service 50c9f2
	fic = 0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    cache = fi.cache;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Destructs the QFileInfo.
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QFileInfo::~QFileInfo()
Packit Service 50c9f2
{
Packit Service 50c9f2
    delete fic;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Makes a copy of \e fi and assigns it to this QFileInfo.
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QFileInfo &QFileInfo::operator=( const QFileInfo &fi )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn = fi.fn;
Packit Service 50c9f2
    if ( !fi.fic ) {
Packit Service 50c9f2
	delete fic;
Packit Service 50c9f2
	fic = 0;
Packit Service 50c9f2
    } else {
Packit Service 50c9f2
	if ( !fic ) {
Packit Service 50c9f2
	    fic = new QFileInfoCache;
Packit Service 50c9f2
	    CHECK_PTR( fic );
Packit Service 50c9f2
	}
Packit Service 50c9f2
	*fic = *fi.fic;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    cache = fi.cache;
Packit Service 50c9f2
    return *this;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Sets the file to obtain information about.
Packit Service 50c9f2
Packit Service 50c9f2
  The string given can be an absolute or a relative file path. Absolute file
Packit Service 50c9f2
  paths begin with the directory separator (e.g. '/' under UNIX) or a drive
Packit Service 50c9f2
  specification (not applicable to UNIX). Relative file names begin with a
Packit Service 50c9f2
  directory name or a file name and specify a path relative to the current
Packit Service 50c9f2
  directory.
Packit Service 50c9f2
Packit Service 50c9f2
  Example:
Packit Service 50c9f2
  \code
Packit Service 50c9f2
    #include <qfileinfo.h>
Packit Service 50c9f2
    #include <qdir.h>
Packit Service 50c9f2
Packit Service 50c9f2
    void test()
Packit Service 50c9f2
    {
Packit Service 50c9f2
	QString absolute = "/liver/aorta";
Packit Service 50c9f2
	QString relative = "liver/aorta";
Packit Service 50c9f2
	QFileInfo fi1( absolute );
Packit Service 50c9f2
	QFileInfo fi2( relative );
Packit Service 50c9f2
Packit Service 50c9f2
	QDir::setCurrent( QDir::rootDirPath() );
Packit Service 50c9f2
				// fi1 and fi2 now point to the same file
Packit Service 50c9f2
Packit Service 50c9f2
	QDir::setCurrent( "/tmp" );
Packit Service 50c9f2
				// fi1 now points to "/liver/aorta",
Packit Service 50c9f2
				// while fi2 points to "/tmp/liver/aorta"
Packit Service 50c9f2
    }
Packit Service 50c9f2
  \endcode
Packit Service 50c9f2
Packit Service 50c9f2
  \sa isRelative(), QDir::setCurrent(), QDir::isRelativePath()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
void QFileInfo::setFile( const QString &file )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn = file;
Packit Service 50c9f2
    slashify( fn );
Packit Service 50c9f2
    delete fic;
Packit Service 50c9f2
    fic = 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Sets the file to obtain information about.
Packit Service 50c9f2
Packit Service 50c9f2
  If the file has a relative path, the QFileInfo will also have one.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa isRelative()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
void QFileInfo::setFile( const QFile &file )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn	= file.name();
Packit Service 50c9f2
    slashify( fn );
Packit Service 50c9f2
    delete fic;
Packit Service 50c9f2
    fic = 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Sets the file to obtains information about to \e fileName in the
Packit Service 50c9f2
  directory \e d.
Packit Service 50c9f2
Packit Service 50c9f2
  If the directory has a relative path, the QFileInfo will also have one.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa isRelative()
Packit Service 50c9f2
*/
Packit Service 50c9f2
#ifndef QT_NO_DIR
Packit Service 50c9f2
void QFileInfo::setFile( const QDir &d, const QString &fileName )
Packit Service 50c9f2
{
Packit Service 50c9f2
    fn	= d.filePath( fileName );
Packit Service 50c9f2
    slashify( fn );
Packit Service 50c9f2
    delete fic;
Packit Service 50c9f2
    fic = 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
#endif
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns TRUE if the file pointed to exists, otherwise FALSE.
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
bool QFileInfo::exists() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return qt_file_access( fn, F_OK );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Refresh the information about the file, i.e. read in information from the
Packit Service 50c9f2
  file system the next time a cached property is fetched.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa setCaching()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
void QFileInfo::refresh() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    QFileInfo *that = (QFileInfo*)this;		// Mutable function
Packit Service 50c9f2
    delete that->fic;
Packit Service 50c9f2
    that->fic = 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  \fn bool QFileInfo::caching() const
Packit Service 50c9f2
  Returns TRUE if caching is enabled.
Packit Service 50c9f2
  \sa setCaching(), refresh()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Enables caching of file information if \e enable is TRUE, or disables it
Packit Service 50c9f2
  if \e enable is FALSE.
Packit Service 50c9f2
Packit Service 50c9f2
  When caching is enabled, QFileInfo reads the file information the first
Packit Service 50c9f2
  time
Packit Service 50c9f2
Packit Service 50c9f2
  Caching is enabled by default.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa refresh(), caching()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
void QFileInfo::setCaching( bool enable )
Packit Service 50c9f2
{
Packit Service 50c9f2
    if ( cache == enable )
Packit Service 50c9f2
	return;
Packit Service 50c9f2
    cache = enable;
Packit Service 50c9f2
    if ( cache ) {
Packit Service 50c9f2
	delete fic;
Packit Service 50c9f2
	fic = 0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns the name, i.e. the file name including the path (which can be
Packit Service 50c9f2
  absolute or relative).
Packit Service 50c9f2
Packit Service 50c9f2
  \sa isRelative(), absFilePath()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QString QFileInfo::filePath() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return fn;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns the base name of the file.
Packit Service 50c9f2
Packit Service 50c9f2
  The base name consists of all characters in the file name up to (but not
Packit Service 50c9f2
  including) the first '.' character.  The path is not included.
Packit Service 50c9f2
Packit Service 50c9f2
  Example:
Packit Service 50c9f2
  \code
Packit Service 50c9f2
     QFileInfo fi( "/tmp/abdomen.lower" );
Packit Service 50c9f2
     QString base = fi.baseName();		// base = "abdomen"
Packit Service 50c9f2
  \endcode
Packit Service 50c9f2
Packit Service 50c9f2
  \sa fileName(), extension()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QString QFileInfo::baseName() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    QString tmp = fileName();
Packit Service 50c9f2
    int pos = tmp.find( '.' );
Packit Service 50c9f2
    if ( pos == -1 )
Packit Service 50c9f2
	return tmp;
Packit Service 50c9f2
    else
Packit Service 50c9f2
	return tmp.left( pos );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns the extension name of the file.
Packit Service 50c9f2
Packit Service 50c9f2
  If \a complete is TRUE (the default), extension() returns the string
Packit Service 50c9f2
  of all characters in the file name after (but not including) the
Packit Service 50c9f2
  first '.'  character.  For a file named "archive.tar.gz" this
Packit Service 50c9f2
  returns "tar.gz".
Packit Service 50c9f2
Packit Service 50c9f2
  If \a complete is FALSE, extension() returns the string of all
Packit Service 50c9f2
  characters in the file name after (but not including) the last '.'
Packit Service 50c9f2
  character.  For a file named "archive.tar.gz" this returns "gz".
Packit Service 50c9f2
Packit Service 50c9f2
  Example:
Packit Service 50c9f2
  \code
Packit Service 50c9f2
     QFileInfo fi( "lex.yy.c" );
Packit Service 50c9f2
     QString ext = fi.extension();		// ext = "yy.c"
Packit Service 50c9f2
     QString ext = fi.extension( FALSE );	// ext = "c"
Packit Service 50c9f2
  \endcode
Packit Service 50c9f2
Packit Service 50c9f2
  \sa fileName(), baseName()
Packit Service 50c9f2
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
QString QFileInfo::extension( bool complete ) const
Packit Service 50c9f2
{
Packit Service 50c9f2
    QString s = fileName();
Packit Service 50c9f2
    int pos = complete ? s.find( '.' ) : s.findRev( '.' );
Packit Service 50c9f2
    if ( pos < 0 )
Packit Service 50c9f2
	return QString::fromLatin1( "" );
Packit Service 50c9f2
    else
Packit Service 50c9f2
	return s.right( s.length() - pos - 1 );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns the directory path of the file.
Packit Service 50c9f2
Packit Service 50c9f2
  If the QFileInfo is relative and \e absPath is FALSE, the QDir will be
Packit Service 50c9f2
  relative, otherwise it will be absolute.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa dirPath(), filePath(), fileName(), isRelative()
Packit Service 50c9f2
*/
Packit Service 50c9f2
#ifndef QT_NO_DIR
Packit Service 50c9f2
QDir QFileInfo::dir( bool absPath ) const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return QDir( dirPath(absPath) );
Packit Service 50c9f2
}
Packit Service 50c9f2
#endif
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns TRUE if the file is readable.
Packit Service 50c9f2
  \sa isWritable(), isExecutable(), permission()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
bool QFileInfo::isReadable() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return qt_file_access( fn, R_OK );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns TRUE if the file is writable.
Packit Service 50c9f2
  \sa isReadable(), isExecutable(), permission()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
bool QFileInfo::isWritable() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return qt_file_access( fn, W_OK );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns TRUE if the file is executable.
Packit Service 50c9f2
  \sa isReadable(), isWritable(), permission()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
bool QFileInfo::isExecutable() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return qt_file_access( fn, X_OK );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Returns TRUE if the file path name is relative to the current directory,
Packit Service 50c9f2
  FALSE if the path is absolute (e.g. under UNIX a path is relative if it
Packit Service 50c9f2
  does not start with a '/').
Packit Service 50c9f2
Packit Service 50c9f2
  According to Einstein this function should always return TRUE.
Packit Service 50c9f2
*/
Packit Service 50c9f2
#ifndef QT_NO_DIR
Packit Service 50c9f2
bool QFileInfo::isRelative() const
Packit Service 50c9f2
{
Packit Service 50c9f2
    return QDir::isRelativePath( fn );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Converts the file path name to an absolute path.
Packit Service 50c9f2
Packit Service 50c9f2
  If it is already absolute nothing is done.
Packit Service 50c9f2
Packit Service 50c9f2
  \sa filePath(), isRelative()
Packit Service 50c9f2
*/
Packit Service 50c9f2
Packit Service 50c9f2
bool QFileInfo::convertToAbs()
Packit Service 50c9f2
{
Packit Service 50c9f2
    if ( isRelative() )
Packit Service 50c9f2
	fn = absFilePath();
Packit Service 50c9f2
    return QDir::isRelativePath( fn );
Packit Service 50c9f2
}
Packit Service 50c9f2
#endif