From: Tim Starling Date: Tue, 4 Jul 2006 14:08:27 +0000 (+0000) Subject: Made wfMkdirParents() faster and more robust X-Git-Tag: 1.31.0-rc.0~56418 X-Git-Url: https://git.cyclocoop.org/%27.WWW_URL.%27admin/?a=commitdiff_plain;h=fb7421206e35e85a56d6d9dbf2744a449084c9ee;p=lhc%2Fweb%2Fwiklou.git Made wfMkdirParents() faster and more robust --- diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 0abdda715b..8b8d57a8e3 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -1535,18 +1535,46 @@ function wfTempDir() { /** * Make directory, and make all parent directories if they don't exist */ -function wfMkdirParents( $fullDir, $mode ) { - $parts = explode( '/', $fullDir ); - $path = ''; - - foreach ( $parts as $dir ) { - $path .= $dir . '/'; - if ( !is_dir( $path ) ) { - if ( !mkdir( $path, $mode ) ) { - return false; - } +function wfMkdirParents( $fullDir, $mode = 0777 ) { + if ( strval( $fullDir ) === '' ) { + return true; + } + + # Go back through the paths to find the first directory that exists + $currentDir = $fullDir; + $createList = array(); + while ( strval( $currentDir ) !== '' && !file_exists( $currentDir ) ) { + # Strip trailing slashes + $currentDir = rtrim( $currentDir, '/\\' ); + + # Add to create list + $createList[] = $currentDir; + + # Find next delimiter searching from the end + $p = max( strrpos( $currentDir, '/' ), strrpos( $currentDir, '\\' ) ); + if ( $p === false ) { + $currentDir = false; + } else { + $currentDir = substr( $currentDir, 0, $p ); } } + + if ( count( $createList ) == 0 ) { + # Directory specified already exists + return true; + } elseif ( $currentDir === false ) { + # Went all the way back to root and it apparently doesn't exist + return false; + } + + # Now go forward creating directories + $createList = array_reverse( $createList ); + foreach ( $createList as $dir ) { + # use chmod to override the umask, as suggested by the PHP manual + if ( !mkdir( $dir, $mode ) || !chmod( $dir, $mode ) ) { + return false; + } + } return true; }