|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2001 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Based on qdir_unix.cpp
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1992-2000 Trolltech AS.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qglobal.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qdir.h"
|
|
Packit |
1c1d7e |
#ifndef QT_NO_DIR
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qfileinfo.h"
|
|
Packit |
1c1d7e |
#include "qfiledefs_p.h"
|
|
Packit |
1c1d7e |
#include "qregexp.h"
|
|
Packit |
1c1d7e |
#include "qstringlist.h"
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
#include <ctype.h>
|
|
Packit |
1c1d7e |
#if defined(_OS_WIN32_)
|
|
Packit |
1c1d7e |
#if defined(_CC_BOOL_DEF_)
|
|
Packit |
1c1d7e |
#undef bool
|
|
Packit |
1c1d7e |
#include <windows.h>
|
|
Packit |
1c1d7e |
#define bool int
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
#include <windows.h>
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
#if defined(_OS_OS2EMX_)
|
|
Packit |
1c1d7e |
extern Q_UINT32 DosQueryCurrentDisk(Q_UINT32*,Q_UINT32*);
|
|
Packit |
1c1d7e |
#define NO_ERROR 0
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
extern QStringList qt_makeFilterList( const QString &filter );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
extern int qt_cmp_si_sortSpec;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(Q_C_CALLBACKS)
|
|
Packit |
1c1d7e |
extern "C" {
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
extern int qt_cmp_si( const void *, const void * );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(Q_C_CALLBACKS)
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QString p_getenv( QString name )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DWORD len = GetEnvironmentVariableW( ( LPCWSTR ) qt_winTchar ( name, TRUE ), NULL, 0 );
|
|
Packit |
1c1d7e |
if ( len == 0 )
|
|
Packit |
1c1d7e |
return QString::null;
|
|
Packit |
1c1d7e |
/* ansi: we allocate too much memory, but this shouldn't be the problem here ... */
|
|
Packit |
1c1d7e |
LPWSTR buf = (LPWSTR)new WCHAR[ len ];
|
|
Packit |
1c1d7e |
len = GetEnvironmentVariableW ( ( LPCWSTR ) qt_winTchar ( name, TRUE ), buf, len );
|
|
Packit |
1c1d7e |
if ( len == 0 )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete[] buf;
|
|
Packit |
1c1d7e |
return QString::null;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QString ret = qt_winQString ( buf );
|
|
Packit |
1c1d7e |
delete[] buf;
|
|
Packit |
1c1d7e |
return ret;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QDir::slashify( QString& n )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
for ( int i=0; i<(int)n.length(); i++ )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( n[i] == '\\' )
|
|
Packit |
1c1d7e |
n[i] = '/';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString QDir::homeDirPath()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString d = p_getenv ( "HOME" );
|
|
Packit |
1c1d7e |
if ( d.isNull () ) {
|
|
Packit |
1c1d7e |
d = p_getenv ( "USERPROFILE" );
|
|
Packit |
1c1d7e |
if ( d.isNull () ) {
|
|
Packit |
1c1d7e |
QString homeDrive = p_getenv ( "HOMEDRIVE" );
|
|
Packit |
1c1d7e |
QString homePath = p_getenv ( "HOMEPATH" );
|
|
Packit |
1c1d7e |
if ( !homeDrive.isNull () && !homePath.isNull () ) {
|
|
Packit |
1c1d7e |
d = homeDrive + homePath;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
d = rootDirPath ();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
slashify( d );
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString QDir::canonicalPath() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString r;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
char cur[PATH_MAX];
|
|
Packit |
1c1d7e |
char tmp[PATH_MAX];
|
|
Packit |
1c1d7e |
GETCWD( cur, PATH_MAX );
|
|
Packit |
1c1d7e |
if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
|
|
Packit |
1c1d7e |
GETCWD( tmp, PATH_MAX );
|
|
Packit |
1c1d7e |
r = QFile::decodeName(tmp);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
CHDIR( cur );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
slashify( r );
|
|
Packit |
1c1d7e |
return r;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 ) == 0;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
return _wmkdir( ( LPCWSTR ) filePath( dirName, acceptAbsPath ).ucs2() ) == 0;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
return RMDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
return _wrmdir( ( LPCWSTR ) filePath( dirName, acceptAbsPath ).ucs2() ) == 0;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::isReadable() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString path = dPath;
|
|
Packit |
1c1d7e |
if ( ( path[ 0 ] == '\\' ) || ( path[ 0 ] == '/' ) )
|
|
Packit |
1c1d7e |
path = rootDirPath() + path;
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
return ACCESS( QFile::encodeName(dPath), R_OK ) == 0;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
return ( _waccess( (wchar_t*) path.ucs2(), R_OK ) == 0 );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::isRoot() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString path = dPath;
|
|
Packit |
1c1d7e |
slashify( path );
|
|
Packit |
1c1d7e |
return path == rootDirPath ();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::rename( const QString &name, const QString &newName,
|
|
Packit |
1c1d7e |
bool acceptAbsPaths )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( name.isEmpty() || newName.isEmpty() ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
qWarning( "QDir::rename: Empty or null file name(s)" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QString fn1 = filePath( name, acceptAbsPaths );
|
|
Packit |
1c1d7e |
QString fn2 = filePath( newName, acceptAbsPaths );
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
return ::rename( QFile::encodeName(fn1),
|
|
Packit |
1c1d7e |
QFile::encodeName(fn2) ) == 0;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
return MoveFileW( ( LPCWSTR ) fn1.ucs2(), ( LPCWSTR ) fn2.ucs2() ) != 0;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::setCurrent( const QString &path )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
int r;
|
|
Packit |
1c1d7e |
r = CHDIR( QFile::encodeName(path) );
|
|
Packit |
1c1d7e |
return r >= 0;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
if ( !QDir( path ).exists() )
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
return ( SetCurrentDirectoryW( ( LPCWSTR ) path.ucs2() ) >= 0 );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString QDir::currentDirPath()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString result;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
STATBUF st;
|
|
Packit |
1c1d7e |
if ( STAT( ".", &st ) == 0 ) {
|
|
Packit |
1c1d7e |
char currentName[PATH_MAX];
|
|
Packit |
1c1d7e |
if ( GETCWD( currentName, PATH_MAX ) != 0 )
|
|
Packit |
1c1d7e |
result = QFile::decodeName(currentName);
|
|
Packit |
1c1d7e |
#if defined(DEBUG)
|
|
Packit |
1c1d7e |
if ( result.isNull() )
|
|
Packit |
1c1d7e |
qWarning( "QDir::currentDirPath: getcwd() failed" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
#if defined(DEBUG)
|
|
Packit |
1c1d7e |
qWarning( "QDir::currentDirPath: stat(\".\") failed" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DWORD size = 0;
|
|
Packit |
1c1d7e |
WCHAR currentName[ PATH_MAX ];
|
|
Packit |
1c1d7e |
size = ::GetCurrentDirectoryW( PATH_MAX, currentName );
|
|
Packit |
1c1d7e |
if ( size != 0 ) {
|
|
Packit |
1c1d7e |
if ( size > PATH_MAX ) {
|
|
Packit |
1c1d7e |
WCHAR * newCurrentName = new WCHAR[ size ];
|
|
Packit |
1c1d7e |
if ( ::GetCurrentDirectoryW( PATH_MAX, newCurrentName ) != 0 )
|
|
Packit |
1c1d7e |
result = QString::fromUcs2( ( ushort* ) newCurrentName );
|
|
Packit |
1c1d7e |
delete [] newCurrentName;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
result = QString::fromUcs2( ( ushort* ) currentName );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( result.length() >= 2 && result[ 1 ] == ':' )
|
|
Packit |
1c1d7e |
result[ 0 ] = result.at( 0 ).upper(); // Force uppercase drive letters.
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
slashify( result );
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString QDir::rootDirPath()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString d = p_getenv ( "SystemDrive" );
|
|
Packit |
1c1d7e |
if ( d.isNull () )
|
|
Packit |
1c1d7e |
d = QString::fromLatin1( "c:" ); // not "c:\\" !
|
|
Packit |
1c1d7e |
slashify ( d );
|
|
Packit |
1c1d7e |
return d;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::isRelativePath( const QString &path )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( path.isEmpty() )
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
int p = 0;
|
|
Packit |
1c1d7e |
if ( path[ 0 ].isLetter() && path[ 1 ] == ':' )
|
|
Packit |
1c1d7e |
p = 2; // we have checked the first 2.
|
|
Packit |
1c1d7e |
return ( ( path[ p ] != '/' ) && ( path[ p ] != '\\' ) );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#undef IS_SUBDIR
|
|
Packit |
1c1d7e |
#undef IS_RDONLY
|
|
Packit |
1c1d7e |
#undef IS_ARCH
|
|
Packit |
1c1d7e |
#undef IS_HIDDEN
|
|
Packit |
1c1d7e |
#undef IS_SYSTEM
|
|
Packit |
1c1d7e |
#undef FF_GETFIRST
|
|
Packit |
1c1d7e |
#undef FF_GETNEXT
|
|
Packit |
1c1d7e |
#undef FF_ERROR
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(_OS_WIN32_)
|
|
Packit |
1c1d7e |
#define IS_SUBDIR FILE_ATTRIBUTE_DIRECTORY
|
|
Packit |
1c1d7e |
#define IS_RDONLY FILE_ATTRIBUTE_READONLY
|
|
Packit |
1c1d7e |
#define IS_ARCH FILE_ATTRIBUTE_ARCHIVE
|
|
Packit |
1c1d7e |
#define IS_HIDDEN FILE_ATTRIBUTE_HIDDEN
|
|
Packit |
1c1d7e |
#define IS_SYSTEM FILE_ATTRIBUTE_SYSTEM
|
|
Packit |
1c1d7e |
#define FF_GETFIRST FindFirstFile
|
|
Packit |
1c1d7e |
#define FF_GETNEXT FindNextFile
|
|
Packit |
1c1d7e |
#define FF_ERROR INVALID_HANDLE_VALUE
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
#define IS_SUBDIR _A_SUBDIR
|
|
Packit |
1c1d7e |
#define IS_RDONLY _A_RDONLY
|
|
Packit |
1c1d7e |
#define IS_ARCH _A_ARCH
|
|
Packit |
1c1d7e |
#define IS_HIDDEN _A_HIDDEN
|
|
Packit |
1c1d7e |
#define IS_SYSTEM _A_SYSTEM
|
|
Packit |
1c1d7e |
#define FF_GETFIRST _findfirst
|
|
Packit |
1c1d7e |
#define FF_GETNEXT _findnext
|
|
Packit |
1c1d7e |
#define FF_ERROR -1
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QDir::readDirEntries( const QString &nameFilter,
|
|
Packit |
1c1d7e |
int filterSpec, int sortSpec )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ( !fList ) {
|
|
Packit |
1c1d7e |
fList = new QStringList;
|
|
Packit |
1c1d7e |
CHECK_PTR( fList );
|
|
Packit |
1c1d7e |
fiList = new QFileInfoList;
|
|
Packit |
1c1d7e |
CHECK_PTR( fiList );
|
|
Packit |
1c1d7e |
fiList->setAutoDelete( TRUE );
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
fList->clear();
|
|
Packit |
1c1d7e |
fiList->clear();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QStringList filters = qt_makeFilterList( nameFilter );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool doDirs = (filterSpec & Dirs) != 0;
|
|
Packit |
1c1d7e |
bool doFiles = (filterSpec & Files) != 0;
|
|
Packit |
1c1d7e |
bool noSymLinks = (filterSpec & NoSymLinks) != 0;
|
|
Packit |
1c1d7e |
bool doReadable = (filterSpec & Readable) != 0;
|
|
Packit |
1c1d7e |
bool doWritable = (filterSpec & Writable) != 0;
|
|
Packit |
1c1d7e |
bool doExecable = (filterSpec & Executable) != 0;
|
|
Packit |
1c1d7e |
bool doHidden = (filterSpec & Hidden) != 0;
|
|
Packit |
1c1d7e |
// show hidden files if the user asks explicitly for e.g. .*
|
|
Packit |
1c1d7e |
if ( !doHidden && !nameFilter.isEmpty() && nameFilter[0] == '.' )
|
|
Packit |
1c1d7e |
doHidden = TRUE;
|
|
Packit |
1c1d7e |
bool doModified = (filterSpec & Modified) != 0;
|
|
Packit |
1c1d7e |
bool doSystem = (filterSpec & System) != 0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QRegExp wc( nameFilter.data(), FALSE, TRUE ); // wild card, case insensitive
|
|
Packit |
1c1d7e |
bool first = TRUE;
|
|
Packit |
1c1d7e |
QString p = dPath.copy();
|
|
Packit |
1c1d7e |
int plen = p.length();
|
|
Packit |
1c1d7e |
#if defined(_OS_WIN32_)
|
|
Packit |
1c1d7e |
HANDLE ff;
|
|
Packit |
1c1d7e |
WIN32_FIND_DATAW finfo;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
long ff;
|
|
Packit |
1c1d7e |
_finddata_t finfo;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
QFileInfo fi;
|
|
Packit |
1c1d7e |
if ( plen == 0 )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_NULL)
|
|
Packit |
1c1d7e |
warning( "QDir::readDirEntries: No directory name specified" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( p.at(plen-1) != '/' && p.at(plen-1) != '\\' )
|
|
Packit |
1c1d7e |
p += '/';
|
|
Packit |
1c1d7e |
p += "*.*";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
ff = FF_GETFIRST( p.data(), &finfo );
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
ff = FindFirstFileW ( ( LPCWSTR ) p.ucs2(), &finfo );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( ff == FF_ERROR )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(DEBUG)
|
|
Packit |
1c1d7e |
warning( "QDir::readDirEntries: Cannot read the directory: %s",
|
|
Packit |
1c1d7e |
(const char *)dPath.utf8() );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
while ( TRUE )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( first )
|
|
Packit |
1c1d7e |
first = FALSE;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
if ( FF_GETNEXT(ff,&finfo) == -1 )
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
//if ( !FF_GETNEXT(ff,&finfo) )
|
|
Packit |
1c1d7e |
// break;
|
|
Packit |
1c1d7e |
if (!FindNextFileW(ff, &finfo ))
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
int attrib = finfo.attrib;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
int attrib = finfo.dwFileAttributes;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
bool isDir = (attrib & IS_SUBDIR) != 0;
|
|
Packit |
1c1d7e |
bool isFile = !isDir;
|
|
Packit |
1c1d7e |
bool isSymLink = FALSE;
|
|
Packit |
1c1d7e |
bool isReadable = TRUE;
|
|
Packit |
1c1d7e |
bool isWritable = (attrib & IS_RDONLY) == 0;
|
|
Packit |
1c1d7e |
bool isExecable = FALSE;
|
|
Packit |
1c1d7e |
bool isModified = (attrib & IS_ARCH) != 0;
|
|
Packit |
1c1d7e |
bool isHidden = (attrib & IS_HIDDEN) != 0;
|
|
Packit |
1c1d7e |
bool isSystem = (attrib & IS_SYSTEM) != 0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
const char *fname = finfo.name;
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
//const char *fname = finfo.cFileName;
|
|
Packit |
1c1d7e |
QString fname = QString::fromUcs2( ( const unsigned short* ) finfo.cFileName);
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( wc.match(fname.utf8()) == -1 && !(allDirs && isDir) )
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString name = fname;
|
|
Packit |
1c1d7e |
if ( doExecable )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString ext = name.right(4).lower();
|
|
Packit |
1c1d7e |
if ( ext == ".exe" || ext == ".com" || ext == ".bat" ||
|
|
Packit |
1c1d7e |
ext == ".pif" || ext == ".cmd" )
|
|
Packit |
1c1d7e |
isExecable = TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( (doDirs && isDir) || (doFiles && isFile) )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( noSymLinks && isSymLink )
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
if ( (filterSpec & RWEMask) != 0 )
|
|
Packit |
1c1d7e |
if ( (doReadable && !isReadable) ||
|
|
Packit |
1c1d7e |
(doWritable && !isWritable) ||
|
|
Packit |
1c1d7e |
(doExecable && !isExecable) )
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
if ( doModified && !isModified )
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
if ( !doHidden && isHidden )
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
if ( !doSystem && isSystem )
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
fi.setFile( *this, name );
|
|
Packit |
1c1d7e |
fiList->append( new QFileInfo( fi ) );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#if defined(__CYGWIN32_)
|
|
Packit |
1c1d7e |
_findclose( ff );
|
|
Packit |
1c1d7e |
#else
|
|
Packit |
1c1d7e |
FindClose( ff );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Sort...
|
|
Packit |
1c1d7e |
QDirSortItem* si= new QDirSortItem[fiList->count()];
|
|
Packit |
1c1d7e |
QFileInfo* itm;
|
|
Packit |
1c1d7e |
i=0;
|
|
Packit |
1c1d7e |
for (itm = fiList->first(); itm; itm = fiList->next())
|
|
Packit |
1c1d7e |
si[i++].item = itm;
|
|
Packit |
1c1d7e |
qt_cmp_si_sortSpec = sortSpec;
|
|
Packit |
1c1d7e |
qsort( si, i, sizeof(si[0]), qt_cmp_si );
|
|
Packit |
1c1d7e |
// put them back in the list
|
|
Packit |
1c1d7e |
fiList->setAutoDelete( FALSE );
|
|
Packit |
1c1d7e |
fiList->clear();
|
|
Packit |
1c1d7e |
int j;
|
|
Packit |
1c1d7e |
for ( j=0; j
|
|
Packit |
1c1d7e |
fiList->append( si[j].item );
|
|
Packit |
1c1d7e |
fList->append( si[j].item->fileName() );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
delete [] si;
|
|
Packit |
1c1d7e |
fiList->setAutoDelete( TRUE );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
|
|
Packit |
1c1d7e |
nameFilter == nameFilt )
|
|
Packit |
1c1d7e |
dirty = FALSE;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
dirty = TRUE;
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
const QFileInfoList * QDir::drives()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// at most one instance of QFileInfoList is leaked, and this variable
|
|
Packit |
1c1d7e |
// points to that list
|
|
Packit |
1c1d7e |
static QFileInfoList * knownMemoryLeak = 0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( !knownMemoryLeak ) {
|
|
Packit |
1c1d7e |
knownMemoryLeak = new QFileInfoList;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(_OS_WIN32_)
|
|
Packit |
1c1d7e |
Q_UINT32 driveBits = (Q_UINT32) GetLogicalDrives() & 0x3ffffff;
|
|
Packit |
1c1d7e |
#elif defined(_OS_OS2EMX_)
|
|
Packit |
1c1d7e |
Q_UINT32 driveBits, cur;
|
|
Packit |
1c1d7e |
if (DosQueryCurrentDisk(&cur,&driveBits) != NO_ERROR)
|
|
Packit |
1c1d7e |
exit(1);
|
|
Packit |
1c1d7e |
driveBits &= 0x3ffffff;
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
char driveName[4];
|
|
Packit |
1c1d7e |
qstrcpy( driveName, "a:/" );
|
|
Packit |
1c1d7e |
while( driveBits ) {
|
|
Packit |
1c1d7e |
if ( driveBits & 1 )
|
|
Packit |
1c1d7e |
knownMemoryLeak->append( new QFileInfo( driveName ) );
|
|
Packit |
1c1d7e |
driveName[0]++;
|
|
Packit |
1c1d7e |
driveBits = driveBits >> 1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
return knownMemoryLeak;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif //QT_NO_DIR
|