static void SearchDirectory_Recursive( StringList& fileNames, const String& fileName, bool recursive ) { String fileDir = File::ExtractDrive( fileName ) + File::ExtractDirectory( fileName ); String wildSpec = File::ExtractName( fileName ) + File::ExtractExtension( fileName ); FindFileInfo info; for ( File::Find f( fileName ); f.NextItem( info ); ) if ( !info.IsDirectory() ) if ( info.name.WildMatch( wildSpec ) ) { String path = fileDir + '/' + info.name; if ( !fileNames.Contains( path ) ) fileNames.Add( path ); } if ( recursive ) { StringList directories; for ( File::Find f( fileDir + "/*" ); f.NextItem( info ); ) if ( info.IsDirectory() && info.name != "." && info.name != ".." ) directories.Add( info.name ); for ( StringList::const_iterator i = directories.Begin(); i != directories.End(); ++i ) SearchDirectory_Recursive( fileNames, fileDir + '/' + *i + '/' + wildSpec, true ); } }
void PixInsightX11Installer::RemoveDirectory_Recursive( const String& dirPath, const String& baseDir ) { if ( dirPath.Has( ".." ) ) throw Error( "RemoveDirectory(): Attempt to climb up the filesystem." ); if ( !dirPath.BeginsWith( baseDir ) ) throw Error( "RemoveDirectory(): Attempt to redirect outside the base directory." ); if ( !File::DirectoryExists( dirPath ) ) throw Error( "RemoveDirectory(): Attempt to remove a nonexistent directory." ); String currentDir = dirPath; if ( !currentDir.EndsWith( '/' ) ) currentDir += '/'; FindFileInfo info; for ( File::Find f( currentDir + "*" ); f.NextItem( info ); ) { String itemPath = currentDir + info.name; if ( info.IsDirectory() ) { if ( info.name != "." && info.name != ".." ) { RemoveDirectory_Recursive( itemPath, baseDir ); File::RemoveDirectory( itemPath ); } } else { File::Remove( itemPath ); } } }
void PixInsightX11Installer::DirectorySearch_Recursive( StringList& foundItems, const String& dirPath, const String& baseDir ) { if ( dirPath.Has( ".." ) ) throw Error( "SearchDirectory(): Attempt to redirect outside the base directory." ); if ( !dirPath.BeginsWith( baseDir ) ) throw Error( "SearchDirectory(): Attempt to redirect outside the base directory." ); if ( !File::DirectoryExists( dirPath ) ) throw Error( "SearchDirectory(): Attempt to search a nonexistent directory." ); String currentDir = dirPath; if ( !currentDir.EndsWith( '/' ) ) currentDir += '/'; StringList directories; FindFileInfo info; for ( File::Find f( currentDir + "*" ); f.NextItem( info ); ) if ( info.IsDirectory() ) { if ( info.name != "." && info.name != ".." ) { directories.Add( info.name ); foundItems.Add( currentDir + info.name + '/' ); } } else foundItems.Add( currentDir + info.name ); for ( StringList::const_iterator i = directories.Begin(); i != directories.End(); ++i ) DirectorySearch_Recursive( foundItems, currentDir + *i, baseDir ); }