relative path eg. ../xx/yy/
File => filename eg. filename (without extension)
Extension => ext
IsDirectory => true/false
FullName => Path . File . '.' . Extension
FileName => File . '.' . Extension
Notes
Filenames with multiple Extensions: only the last extensions is saved as extensions
eg: aaa.bbb.ccc results in File=aaa.bbb and Extension=ccc
Filenames are stored in the same case as the are stored in the filesystem
sFilter is only applied to files.
*/
Class CDir
{
var $aFiles;
var $fVerbose;
var $fCasesensitiv = true;
var $fLowercase = false;
/** Constructor
@param fVerbose = false display trace information
*/
Function CDir( $fVerbose = false )
{
$this->fVerbose = $fVerbose;
$this->Init();
}
/** Initialize Class
*/
Function Init()
{
unset( $this->aFiles );
$this->aFiles = array();
}
/** Output messages to screen with echo
@param sText
*/
Function Log( $sText )
{
if ( $this->fVerbose )
{
echo $sText;
flush();
}
}
/** reads directories and filenames
@param $sPath string path eg. '../xx/yy/' (please notice the last '/')
@param $sInclude string regular expression for filtering directories and filenames
@param $fRecursive bool read subdirectories as well
@param $fFiles bool include files
@param $fDirectory bool include directories
@param $sRoot string prepend root directory string (good for converting filesystem paths to urls)
@param $sExclude string regular expression for excluding files and directories
*/
Function Read( $sPath, $sInclude = '', $fRecursive = false, $fFiles = true, $fDirectories = true, $sRoot = '', $sExclude = '' )
{
$this->Log( "Path: $sPath
\n" );
$this->Log( "Include: $sInclude
\n" );
$this->Log( "Recursive: $fRecursive
\n" );
$this->Log( "Files: $fFiles
\n" );
$this->Log( "Directories: $fDirectories
\n" );
$this->Log( "Root: $sRoot
\n" );
$this->Log( "Exclude: $sExclude
\n" );
$aFiles = array();
$oHandle = opendir( $sPath );
while ( ( $sFilename = readdir( $oHandle ) ) !== false )
{
if ( $sFilename == '.' || $sFilename == '..' )
continue;
$aFiles[] = $sFilename;
}
closedir( $oHandle );
foreach( $aFiles as $sFilename )
{
$sFullname = $sRoot . $sFilename;
$fInsert = true;
$fIsDirectory = is_dir( $sPath . $sFilename );
$fExclude = false;
if ( !empty( $sExclude ) )
{
if ( $this->GetCasesensitiv() )
$fExclude = ereg( $sExclude, $sFullname );
else
$fExclude = eregi( $sExclude, $sFullname );
if ( $fExclude )
{
$this->Log( "Excluded: $sFullname
\n" );
$fInsert = false;
}
}
$fInclude = true;
if ( !empty( $sInclude ) && !$fIsDirectory )
{
if ( $this->GetCasesensitiv() )
$fInclude = ereg( $sInclude, $sFullname );
else
$fInclude = eregi( $sInclude, $sFullname );
if ( !$fInclude )
{
$this->Log( "Not Included: $sFullname
\n" );
$fInsert = false;
}
}
if ( !$fFiles && !$fIsDirectory )
$fInsert = false;
if ( !$fDirectories && $fIsDirectory )
$fInsert = false;
if ( $fInsert )
{
$this->Log( "Ok: $sFullname
\n" );
$i = strrpos( $sFilename, '.' ) + 1;
if ( substr( $sFilename, $i - 1, 1 ) == '.' )
{
$sFile = substr( $sFilename, 0, $i - 1 );
$sExtension = substr( $sFilename, $i );
}
else
{
$sFile = $sFilename;
$sExtension = '';
}
if ( $this->GetLowercase() )
{
$sFile = strtolower( $sFile );
$sExtension = strtolower( $sExtension );
}
$aFile = array
(
'Path' => $sRoot,
'File' => $sFile,
'Extension' => $sExtension,
'Filename' => $sFilename,
'Fullname' => $sRoot . $sFilename,
'IsDirectory' => $fIsDirectory
);
// Insert current file into aFiles array
$this->aFiles[] = $aFile;
}
// Recursion?
if ( $fRecursive && $fIsDirectory && !$fExclude )
{
$this->Log( "Rekursion: $sPath$sFilename/
\n" );
$this->Read( $sPath . $sFilename . '/', $sInclude, $fRecursive, $fFiles, $fDirectories, $sRoot . $sFilename . '/', $sExclude );
}
}
}
/** Returns number of files/directories found
return int
*/
Function Count()
{
return( count( $this->aFiles ) );
}
/** Sorts array of found items
param $sKey Key to sort by: File, Extension, Filename, Fullname
param $fAscending = true
*/
Function Sort( $sKey, $fAscending )
{
foreach( $this->aFiles as $aFile )
$aSort[] = $aFile[ $sKey ];
if ( $fAscending )
array_multisort( $aSort, $this->aFiles );
else
array_multisort( $aSort, SORT_DESC, $this->aFiles );
}
/** outputs everything found (good for debugging)
*/
Function Output()
{
echo 'Number of Items found: ' . $this->Count() . "
\n";
echo "