qfileinfo.cpp
Go to the documentation of this file.
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 
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 
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 
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
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 
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 
159 {
160  delete fic;
161 }
162 
163 
164 /*!
165  Makes a copy of \e fi and assigns it to this QFileInfo.
166 */
167 
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 
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 
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 
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 
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 
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 
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 
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
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 
453 {
454  if ( isRelative() )
455  fn = absFilePath();
456  return QDir::isRelativePath( fn );
457 }
458 #endif
Traverses directory structures and contents in a platform-independent way.
Definition: qdir.h:52
QString extension(bool complete=TRUE) const
Definition: qfileinfo.cpp:374
QString name() const
Definition: qfile.h:121
static void slashify(QString &)
static bool isRelativePath(const QString &path)
Definition: qdir_unix.cpp:169
The QString class provides an abstraction of Unicode text and the classic C null-terminated char arra...
Definition: qstring.h:350
bool convertToAbs()
Definition: qfileinfo.cpp:452
QDir dir(bool absPath=FALSE) const
Definition: qfileinfo.cpp:393
static QString fromLatin1(const char *, int len=-1)
Definition: qstring.cpp:14539
QString baseName() const
Definition: qfileinfo.cpp:341
QString filePath() const
Definition: qfileinfo.cpp:321
QString absFilePath() const
QAsciiDict< Entry > fn
QString fn
Definition: qfileinfo.h:126
QString dirPath(bool absPath=FALSE) const
QFileInfoCache * fic
Definition: qfileinfo.h:127
QString left(uint len) const
Definition: qstring.cpp:13199
void setFile(const QString &file)
Definition: qfileinfo.cpp:219
uint length() const
Definition: qstring.h:679
string tmp
Definition: languages.py:63
bool cache
Definition: qfileinfo.h:128
bool qt_file_access(const QString &fn, int t)
Definition: qfile_unix.cpp:54
int findRev(QChar c, int index=-1, bool cs=TRUE) const
Definition: qstring.cpp:13021
bool isWritable() const
Definition: qfileinfo.cpp:415
The QFile class is an I/O device that operates on files.
Definition: qfile.h:50
bool isRelative() const
Definition: qfileinfo.cpp:439
#define CHECK_PTR(p)
Definition: qglobal.h:601
int find(QChar c, int index=0, bool cs=TRUE) const
Definition: qstring.cpp:12902
void setCaching(bool)
Definition: qfileinfo.cpp:302
QString fileName() const
virtual QString filePath(const QString &fileName, bool acceptAbsPath=TRUE) const
Definition: qdir.cpp:323
QFileInfo & operator=(const QFileInfo &)
Definition: qfileinfo.cpp:168
bool isExecutable() const
Definition: qfileinfo.cpp:425
The QFileInfo class provides system-independent file information.
Definition: qfileinfo.h:51
static QCString * s
Definition: config.cpp:1042
const bool TRUE
Definition: qglobal.h:371
QString right(uint len) const
Definition: qstring.cpp:13231
bool exists() const
Definition: qfileinfo.cpp:265
void refresh() const
Definition: qfileinfo.cpp:277
bool isReadable() const
Definition: qfileinfo.cpp:405