Orb/Doxygen/qtools/qfileinfo.cpp
changeset 0 42188c7ea2d9
equal deleted inserted replaced
-1:000000000000 0:42188c7ea2d9
       
     1 /****************************************************************************
       
     2 ** 
       
     3 **
       
     4 ** Implementation of QFileInfo class
       
     5 **
       
     6 ** Created : 950628
       
     7 **
       
     8 ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
       
     9 **
       
    10 ** This file is part of the tools module of the Qt GUI Toolkit.
       
    11 **
       
    12 ** This file may be distributed under the terms of the Q Public License
       
    13 ** as defined by Trolltech AS of Norway and appearing in the file
       
    14 ** LICENSE.QPL included in the packaging of this file.
       
    15 **
       
    16 ** This file may be distributed and/or modified under the terms of the
       
    17 ** GNU General Public License version 2 as published by the Free Software
       
    18 ** Foundation and appearing in the file LICENSE.GPL included in the
       
    19 ** packaging of this file.
       
    20 **
       
    21 ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
       
    22 ** licenses may use this file in accordance with the Qt Commercial License
       
    23 ** Agreement provided with the Software.
       
    24 **
       
    25 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
       
    26 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
       
    27 **
       
    28 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
       
    29 **   information about Qt Commercial License Agreements.
       
    30 ** See http://www.trolltech.com/qpl/ for QPL licensing information.
       
    31 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
       
    32 **
       
    33 ** Contact info@trolltech.com if any conditions of this licensing are
       
    34 ** not clear to you.
       
    35 **
       
    36 **********************************************************************/
       
    37 
       
    38 #include "qglobal.h"
       
    39 
       
    40 #include "qfileinfo.h"
       
    41 #include "qfiledefs_p.h"
       
    42 #include "qdatetime.h"
       
    43 #include "qdir.h"
       
    44 
       
    45 extern bool qt_file_access( const QString& fn, int t );
       
    46 
       
    47 // NOT REVISED
       
    48 /*!
       
    49   \class QFileInfo qfileinfo.h
       
    50   \brief The QFileInfo class provides system-independent file information.
       
    51 
       
    52   \ingroup io
       
    53 
       
    54   QFileInfo provides information about a file's name and position (path) in
       
    55   the file system, its access rights and whether it is a directory or a
       
    56   symbolic link.  Its size and last modified/read times are also available.
       
    57 
       
    58   To speed up performance QFileInfo caches information about the file. Since
       
    59   files can be changed by other users or programs, or even by other parts of
       
    60   the same program there is a function that refreshes the file information;
       
    61   refresh(). If you would rather like a QFileInfo to access the file system
       
    62   every time you request information from it, you can call the function
       
    63   setCaching( FALSE ).
       
    64 
       
    65   A QFileInfo can point to a file using either a relative or an absolute
       
    66   file path. Absolute file paths begin with the directory separator
       
    67   ('/') or a drive specification (not applicable to UNIX).
       
    68   Relative file names begin with a directory name or a file name and specify
       
    69   a path relative to the current directory. An example of
       
    70   an absolute path is the string "/tmp/quartz". A relative path might look like
       
    71   "src/fatlib". You can use the function isRelative() to check if a QFileInfo
       
    72   is using a relative or an absolute file path. You can call the function
       
    73   convertToAbs() to convert a relative QFileInfo to an absolute one.
       
    74 
       
    75   If you need to read and traverse directories, see the QDir class.
       
    76 */
       
    77 
       
    78 
       
    79 /*!
       
    80   Constructs a new empty QFileInfo.
       
    81 */
       
    82 
       
    83 QFileInfo::QFileInfo()
       
    84 {
       
    85     fic	  = 0;
       
    86     cache = TRUE;
       
    87 }
       
    88 
       
    89 /*!
       
    90   Constructs a new QFileInfo that gives information about the given file.
       
    91   The string given can be an absolute or a relative file path.
       
    92 
       
    93   \sa bool setFile(QString ), isRelative(), QDir::setCurrent(),
       
    94   QDir::isRelativePath()
       
    95 */
       
    96 
       
    97 QFileInfo::QFileInfo( const QString &file )
       
    98 {
       
    99     fn	  = file;
       
   100     slashify( fn );
       
   101     fic	  = 0;
       
   102     cache = TRUE;
       
   103 }
       
   104 
       
   105 /*!
       
   106   Constructs a new QFileInfo that gives information about \e file.
       
   107 
       
   108   If the file has a relative path, the QFileInfo will also have one.
       
   109 
       
   110   \sa isRelative()
       
   111 */
       
   112 
       
   113 QFileInfo::QFileInfo( const QFile &file )
       
   114 {
       
   115     fn	  = file.name();
       
   116     slashify( fn );
       
   117     fic	  = 0;
       
   118     cache = TRUE;
       
   119 }
       
   120 
       
   121 /*!
       
   122   Constructs a new QFileInfo that gives information about the file
       
   123   named \e fileName in the directory \e d.
       
   124 
       
   125   If the directory has a relative path, the QFileInfo will also have one.
       
   126 
       
   127   \sa isRelative()
       
   128 */
       
   129 #ifndef QT_NO_DIR
       
   130 QFileInfo::QFileInfo( const QDir &d, const QString &fileName )
       
   131 {
       
   132     fn	  = d.filePath( fileName );
       
   133     slashify( fn );
       
   134     fic	  = 0;
       
   135     cache = TRUE;
       
   136 }
       
   137 #endif
       
   138 /*!
       
   139   Constructs a new QFileInfo that is a copy of \e fi.
       
   140 */
       
   141 
       
   142 QFileInfo::QFileInfo( const QFileInfo &fi )
       
   143 {
       
   144     fn = fi.fn;
       
   145     if ( fi.fic ) {
       
   146 	fic = new QFileInfoCache;
       
   147 	*fic = *fi.fic;
       
   148     } else {
       
   149 	fic = 0;
       
   150     }
       
   151     cache = fi.cache;
       
   152 }
       
   153 
       
   154 /*!
       
   155   Destructs the QFileInfo.
       
   156 */
       
   157 
       
   158 QFileInfo::~QFileInfo()
       
   159 {
       
   160     delete fic;
       
   161 }
       
   162 
       
   163 
       
   164 /*!
       
   165   Makes a copy of \e fi and assigns it to this QFileInfo.
       
   166 */
       
   167 
       
   168 QFileInfo &QFileInfo::operator=( const QFileInfo &fi )
       
   169 {
       
   170     fn = fi.fn;
       
   171     if ( !fi.fic ) {
       
   172 	delete fic;
       
   173 	fic = 0;
       
   174     } else {
       
   175 	if ( !fic ) {
       
   176 	    fic = new QFileInfoCache;
       
   177 	    CHECK_PTR( fic );
       
   178 	}
       
   179 	*fic = *fi.fic;
       
   180     }
       
   181     cache = fi.cache;
       
   182     return *this;
       
   183 }
       
   184 
       
   185 
       
   186 /*!
       
   187   Sets the file to obtain information about.
       
   188 
       
   189   The string given can be an absolute or a relative file path. Absolute file
       
   190   paths begin with the directory separator (e.g. '/' under UNIX) or a drive
       
   191   specification (not applicable to UNIX). Relative file names begin with a
       
   192   directory name or a file name and specify a path relative to the current
       
   193   directory.
       
   194 
       
   195   Example:
       
   196   \code
       
   197     #include <qfileinfo.h>
       
   198     #include <qdir.h>
       
   199 
       
   200     void test()
       
   201     {
       
   202 	QString absolute = "/liver/aorta";
       
   203 	QString relative = "liver/aorta";
       
   204 	QFileInfo fi1( absolute );
       
   205 	QFileInfo fi2( relative );
       
   206 
       
   207 	QDir::setCurrent( QDir::rootDirPath() );
       
   208 				// fi1 and fi2 now point to the same file
       
   209 
       
   210 	QDir::setCurrent( "/tmp" );
       
   211 				// fi1 now points to "/liver/aorta",
       
   212 				// while fi2 points to "/tmp/liver/aorta"
       
   213     }
       
   214   \endcode
       
   215 
       
   216   \sa isRelative(), QDir::setCurrent(), QDir::isRelativePath()
       
   217 */
       
   218 
       
   219 void QFileInfo::setFile( const QString &file )
       
   220 {
       
   221     fn = file;
       
   222     slashify( fn );
       
   223     delete fic;
       
   224     fic = 0;
       
   225 }
       
   226 
       
   227 /*!
       
   228   Sets the file to obtain information about.
       
   229 
       
   230   If the file has a relative path, the QFileInfo will also have one.
       
   231 
       
   232   \sa isRelative()
       
   233 */
       
   234 
       
   235 void QFileInfo::setFile( const QFile &file )
       
   236 {
       
   237     fn	= file.name();
       
   238     slashify( fn );
       
   239     delete fic;
       
   240     fic = 0;
       
   241 }
       
   242 
       
   243 /*!
       
   244   Sets the file to obtains information about to \e fileName in the
       
   245   directory \e d.
       
   246 
       
   247   If the directory has a relative path, the QFileInfo will also have one.
       
   248 
       
   249   \sa isRelative()
       
   250 */
       
   251 #ifndef QT_NO_DIR
       
   252 void QFileInfo::setFile( const QDir &d, const QString &fileName )
       
   253 {
       
   254     fn	= d.filePath( fileName );
       
   255     slashify( fn );
       
   256     delete fic;
       
   257     fic = 0;
       
   258 }
       
   259 #endif
       
   260 
       
   261 /*!
       
   262   Returns TRUE if the file pointed to exists, otherwise FALSE.
       
   263 */
       
   264 
       
   265 bool QFileInfo::exists() const
       
   266 {
       
   267     return qt_file_access( fn, F_OK );
       
   268 }
       
   269 
       
   270 /*!
       
   271   Refresh the information about the file, i.e. read in information from the
       
   272   file system the next time a cached property is fetched.
       
   273 
       
   274   \sa setCaching()
       
   275 */
       
   276 
       
   277 void QFileInfo::refresh() const
       
   278 {
       
   279     QFileInfo *that = (QFileInfo*)this;		// Mutable function
       
   280     delete that->fic;
       
   281     that->fic = 0;
       
   282 }
       
   283 
       
   284 /*!
       
   285   \fn bool QFileInfo::caching() const
       
   286   Returns TRUE if caching is enabled.
       
   287   \sa setCaching(), refresh()
       
   288 */
       
   289 
       
   290 /*!
       
   291   Enables caching of file information if \e enable is TRUE, or disables it
       
   292   if \e enable is FALSE.
       
   293 
       
   294   When caching is enabled, QFileInfo reads the file information the first
       
   295   time
       
   296 
       
   297   Caching is enabled by default.
       
   298 
       
   299   \sa refresh(), caching()
       
   300 */
       
   301 
       
   302 void QFileInfo::setCaching( bool enable )
       
   303 {
       
   304     if ( cache == enable )
       
   305 	return;
       
   306     cache = enable;
       
   307     if ( cache ) {
       
   308 	delete fic;
       
   309 	fic = 0;
       
   310     }
       
   311 }
       
   312 
       
   313 
       
   314 /*!
       
   315   Returns the name, i.e. the file name including the path (which can be
       
   316   absolute or relative).
       
   317 
       
   318   \sa isRelative(), absFilePath()
       
   319 */
       
   320 
       
   321 QString QFileInfo::filePath() const
       
   322 {
       
   323     return fn;
       
   324 }
       
   325 
       
   326 /*!
       
   327   Returns the base name of the file.
       
   328 
       
   329   The base name consists of all characters in the file name up to (but not
       
   330   including) the first '.' character.  The path is not included.
       
   331 
       
   332   Example:
       
   333   \code
       
   334      QFileInfo fi( "/tmp/abdomen.lower" );
       
   335      QString base = fi.baseName();		// base = "abdomen"
       
   336   \endcode
       
   337 
       
   338   \sa fileName(), extension()
       
   339 */
       
   340 
       
   341 QString QFileInfo::baseName() const
       
   342 {
       
   343     QString tmp = fileName();
       
   344     int pos = tmp.find( '.' );
       
   345     if ( pos == -1 )
       
   346 	return tmp;
       
   347     else
       
   348 	return tmp.left( pos );
       
   349 }
       
   350 
       
   351 /*!
       
   352   Returns the extension name of the file.
       
   353 
       
   354   If \a complete is TRUE (the default), extension() returns the string
       
   355   of all characters in the file name after (but not including) the
       
   356   first '.'  character.  For a file named "archive.tar.gz" this
       
   357   returns "tar.gz".
       
   358 
       
   359   If \a complete is FALSE, extension() returns the string of all
       
   360   characters in the file name after (but not including) the last '.'
       
   361   character.  For a file named "archive.tar.gz" this returns "gz".
       
   362 
       
   363   Example:
       
   364   \code
       
   365      QFileInfo fi( "lex.yy.c" );
       
   366      QString ext = fi.extension();		// ext = "yy.c"
       
   367      QString ext = fi.extension( FALSE );	// ext = "c"
       
   368   \endcode
       
   369 
       
   370   \sa fileName(), baseName()
       
   371 
       
   372 */
       
   373 
       
   374 QString QFileInfo::extension( bool complete ) const
       
   375 {
       
   376     QString s = fileName();
       
   377     int pos = complete ? s.find( '.' ) : s.findRev( '.' );
       
   378     if ( pos < 0 )
       
   379 	return QString::fromLatin1( "" );
       
   380     else
       
   381 	return s.right( s.length() - pos - 1 );
       
   382 }
       
   383 
       
   384 /*!
       
   385   Returns the directory path of the file.
       
   386 
       
   387   If the QFileInfo is relative and \e absPath is FALSE, the QDir will be
       
   388   relative, otherwise it will be absolute.
       
   389 
       
   390   \sa dirPath(), filePath(), fileName(), isRelative()
       
   391 */
       
   392 #ifndef QT_NO_DIR
       
   393 QDir QFileInfo::dir( bool absPath ) const
       
   394 {
       
   395     return QDir( dirPath(absPath) );
       
   396 }
       
   397 #endif
       
   398 
       
   399 
       
   400 /*!
       
   401   Returns TRUE if the file is readable.
       
   402   \sa isWritable(), isExecutable(), permission()
       
   403 */
       
   404 
       
   405 bool QFileInfo::isReadable() const
       
   406 {
       
   407     return qt_file_access( fn, R_OK );
       
   408 }
       
   409 
       
   410 /*!
       
   411   Returns TRUE if the file is writable.
       
   412   \sa isReadable(), isExecutable(), permission()
       
   413 */
       
   414 
       
   415 bool QFileInfo::isWritable() const
       
   416 {
       
   417     return qt_file_access( fn, W_OK );
       
   418 }
       
   419 
       
   420 /*!
       
   421   Returns TRUE if the file is executable.
       
   422   \sa isReadable(), isWritable(), permission()
       
   423 */
       
   424 
       
   425 bool QFileInfo::isExecutable() const
       
   426 {
       
   427     return qt_file_access( fn, X_OK );
       
   428 }
       
   429 
       
   430 
       
   431 /*!
       
   432   Returns TRUE if the file path name is relative to the current directory,
       
   433   FALSE if the path is absolute (e.g. under UNIX a path is relative if it
       
   434   does not start with a '/').
       
   435 
       
   436   According to Einstein this function should always return TRUE.
       
   437 */
       
   438 #ifndef QT_NO_DIR
       
   439 bool QFileInfo::isRelative() const
       
   440 {
       
   441     return QDir::isRelativePath( fn );
       
   442 }
       
   443 
       
   444 /*!
       
   445   Converts the file path name to an absolute path.
       
   446 
       
   447   If it is already absolute nothing is done.
       
   448 
       
   449   \sa filePath(), isRelative()
       
   450 */
       
   451 
       
   452 bool QFileInfo::convertToAbs()
       
   453 {
       
   454     if ( isRelative() )
       
   455 	fn = absFilePath();
       
   456     return QDir::isRelativePath( fn );
       
   457 }
       
   458 #endif