Viewing file: Folders.php (19.86 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php /** * Provides the locations of several system and user directories * independent of the operating system used. * * Simpe example: * require_once 'System/Folders.php'; * $sf = new System_Folders(); * echo $sf->getHome(); * * If you want the folders to be cached (not re-calculated on every * read), use System_Folders_Cached. * * PHP version 4 * * @category System * @package System_Folders * @author Christian Weiske <cweiske@php.net> * @license http://www.gnu.org/copyleft/lesser.html LGPL * @version CVS: $Id$ * @link http://pear.php.net/package/System_Folders */
require_once 'OS/Guess.php';
if (!defined('SYS_LINUX')) { define('SYS_LINUX', 'linux'); define('SYS_WINDOWS', 'windows'); define('SYS_MAC', 'darwin'); }
/** * Provides the locations of several system and user directories * independent of the operating system used. * * If a path does not exist or can't be found (error), NULL is returned. * * The class uses both $_ENV and $_SERVER to retrieve the environment * paths, as this seems to be different between php4 and 5. * * @category System * @package System_Folders * @author Christian Weiske <cweiske@php.net> * @license http://www.gnu.org/copyleft/lesser.html LGPL * @link http://pear.php.net/package/System_Folders */ class System_Folders { /** * The operating system on which * we work here * Gotten from OS_Guess::getSysname() * * Values (are lowercase): * - windows * - linux * - darwin * * Use the SYS_* constants to check it * * @var string * @access protected */ var $sys = 'unknown';
/** * Known names for the application directory * in windows. * * @var array * @access protected */ var $arAppDataNames = array( 'Application data', //english 'Anwendungsdaten', //german 'Toepassingsgegevens', //dutch 'Datos de programa', //spanish 'Dados de aplicativos', //portugese 'Data aplikací', //czech 'Programdata', //norwegian 'Henkilokohtainen', //finnish 'Donnees d\'applications',//french 'Dati applicazioni', //italian 'Dane aplikacji', //polish );
/** * Known names for the my documents directory * on windows. * * @var array * @access protected */ var $arDocumentsWindows = array( 'My Documents', //english 'Own Files', //english? 'Eigene Dateien', //german 'Documenti', //italian );
/** * Known names for the my Desktop directory. * * @var array * @access protected */ var $arDesktop = array( 'Desktop' //english, german, italian );
/** * Known names for the my documents directory * on linux and mac. * * @var array * @access protected */ var $arDocumentsLinux = array( 'Documents', //english 'Dokumente', //german 'Documenti', //italian );
/** * Known paths for the documents and settings directory * on windows. * * @var array * @access protected */ var $arDocsAndSettings = array( 'C:\\Documents and Settings\\', //english, italian 'C:\\Dokumente und Einstellungen\\' //german );
/** * Known paths for the programs directory on windows. * * @var array * @access protected */ var $arProgramsWindows = array( 'C:\\Program Files\\', 'C:\\Programs\\', 'C:\\Programme\\', //german 'C:\\Programmi\\', //italian );
/** * Known names for the shared documents directory * on windows. * Although the explorer shows "Shared documents" * or "Gemeinsame Dokumente", the *real* directory * is only one of the ones here. * * @var array * @access protected */ var $arSharedDocumentsWindows = array( 'Documents', //english 'Dokumente', //german 'Documenti', //italian );
/** * Known paths for the windows directory. * * @var array * @access protected */ var $arWindowsDirs = array( 'C:\\WINDOWS\\', 'C:\\WINNT\\', 'C:\\WIN98\\', 'C:\\WIN95\\', 'C:\\WIN2000\\', 'C:\\WIN2K\\', 'C:\\WINXP\\' );
/** * COM object used in Windows to get * special folder locations via SpecialFolders() * described in * @link http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/14761fa3-19be-4742-9f91-23b48cd9228f.asp * * Available folders: * AllUsersDesktop * AllUsersStartMenu * AllUsersPrograms * AllUsersStartup * Desktop * Favorites * Fonts * MyDocuments * NetHood * PrintHood * Programs * Recent * SendTo * StartMenu * Startup * Templates * * If this variable is NULL, it hasn't been created yet. * If it is FALSE, it cannot be created and used (e.g. * because COM is not available) * * @var COM * @access protected */ var $objCom = null;
/** * Constructor; initializes the system variable. */ function System_Folders() { $og = new OS_Guess(); $this->sys = $og->getSysname(); }//function System_Folders()
/** * Adds a trailing slash to the given path if there is none. * Uses DIRECTORY_SEPARATOR, so it works with windows and *nix. * * @param string $strPath The path * * @return string The path with a trailing slash * * @access protected */ function addTrailingSlash($strPath) { if ($strPath === null) { return $strPath; } if (substr($strPath, -1) !== DIRECTORY_SEPARATOR) { $strPath .= DIRECTORY_SEPARATOR; } return $strPath; }//function addTrailingSlash($strPath)
/** * Directories in windows environment variables sometimes * have a double backslash, and this needs to be fixed. * * @param string $strPath The path * * @return string The fixed path * * @access protected */ function fixWindowsPath($strPath) { if ($strPath === null) { return null; } return str_replace('\\\\', '\\', $strPath); }//function fixWindowsPath($strPath)
/** * Loops through a list of given paths and checks * which of them are correct. * * @param array $arPaths Array with paths to test * @param string $strBase Base directory that shall be prepended to all paths * @param string $strSuffix String appended to the directory path * * @return string The directory that exists. NULL if none of them matched. * * @access protected * @static */ function tryPaths($arPaths, $strBase = '', $strSuffix = '') { foreach ($arPaths as $strName) { $strTmp = $strBase . $strName . $strSuffix; if (file_exists($strTmp) && is_dir($strTmp)) { return $strTmp; } }
return null; }//function tryPaths($arPaths, $strBase = '', $strSuffix = '')
/** * Loads the COM object into the $objCom variable. * * @return boolean True if it could be loaded, false if not * * @access protected */ function loadCOM() { //prevent double-loading if ($this->objCom !== null) { return $this->objCom !== false; }
if (!class_exists('COM')) { $this->objCom = false; return false; } $this->objCom = new COM('WScript.Shell'); if (!$this->objCom) { $this->objCom = false; return false; } return true; }//function loadCOM()
/** * Loads a windows path via COM using $objCom. * * @param string $strType See $objCom for allowed values. * * @return mixed False if no path could be obtained, string otherwise * * @access protected */ function getCOMPath($strType) { if (!$this->loadCOM()) { return false; } $strPath = $this->objCom->SpecialFolders($strType); if (!$strPath || $strPath == '') { return false; } else { return $strPath; } }//function getCOMPath($strType)
/** * Returns the All Users directory. * Works on windows only, returns NULL if not found. * * @return string The all users directory * * @access public */ function getAllUsers() { if ($this->sys == SYS_WINDOWS) { $arEnv = $_SERVER + $_ENV; if (isset($arEnv['ALLUSERSPROFILE']) && is_dir($arEnv['ALLUSERSPROFILE']) ) { return $this->addTrailingSlash($arEnv['ALLUSERSPROFILE']); } else { $strDocsAndSettings = System_Folders::tryPaths( $this->arDocsAndSettings ); if ($strDocsAndSettings !== null) { $strAll = $strDocsAndSettings . 'All Users'; if (is_dir($strAll)) { return $this->addTrailingSlash($strAll); } } } } return null; }//function getAllUsers()
/** * Returns the path to the application data directory. * This is the directory in which applications save their * settings. * * On Windows, this is an own directory called "Application data", * on *nix, the home directory is used. * MacOS X has two application settings directories: * - $HOME/Library/Preferences/<pref_file> for normal settings * - $HOME/Library/Application Support/<app_name>/ for data files that * that the application needs to store * This method returns the latter, as it works for both storing just * prefs and files in an application specific subdir. That's not 100% * correct for apple, but it will work. * * @return string The application data directory * * @access public */ function getAppData() { $strAppData = null; if ($this->sys == SYS_WINDOWS) { /** * win2k/xp: user_dir/names * win98: C:\windows\Anwendungsdaten|appdata */ $strHome = $this->getHome(); $strAppData = System_Folders::tryPaths($this->arAppDataNames, $strHome); if ($strAppData == null) { /** * We didn't find it in the user directory, * so check the windows dir - win9x had the * data there */ $strWindows = $this->getWindows(); $strAppData = System_Folders::tryPaths( $this->arAppDataNames, $strWindows ); }//appdata still null } else { $strAppData = $this->getHome(); }
return $this->addTrailingSlash($strAppData); }//function getAppData()
/** * Returns the path to the user's desktop. * * @return string The user's desktop * * @access public */ function getDesktop() { $strDesktop = null;
if ($this->sys == SYS_WINDOWS) { $strDesktop = $this->getCOMPath('Desktop'); if ($strDesktop !== false && file_exists($strDesktop)) { return $this->addTrailingSlash($this->fixWindowsPath($strDesktop)); } }
$strHome = $this->getHome(); if ($strHome === null) { return null; }
$strDesktop = System_Folders::tryPaths($this->arDesktop, $strHome);
return $this->addTrailingSlash($strDesktop); }//function getDesktop()
/** * Returns the path to the user's documents directory. * (normally below the home folder) * * @return string The "documents" directory * * @access public */ function getDocuments() { $strDocuments = null;
if ($this->sys == SYS_WINDOWS) { $strDocuments = $this->getCOMPath('MyDocuments'); if ($strDocuments !== false && file_exists($strDocuments)) { return $this->addTrailingSlash($this->fixWindowsPath($strDocuments)); } $arKnownNames = $this->arDocumentsWindows; } else { $arKnownNames = $this->arDocumentsLinux; }
$strHome = $this->getHome(); if ($strHome === null) { return null; } $strDocuments = System_Folders::tryPaths($arKnownNames, $strHome);
return $this->addTrailingSlash($strDocuments); }//function getDocuments()
/** * Returns the path to the user's home directory. * * @return string The user's home directory * * @access public */ function getHome() { $strHome = null; if ($this->sys == SYS_LINUX) { if (isset($_ENV['HOME'])) { //environment variable set $strHome = $_ENV['HOME']; } else { //env not set, so try the default directory $strUser = $this->getUserName(); if ($strUser == 'root') { $strHome = '/root'; } else if ($strUser !== null) { $strHome = '/home/' . $strUser; } } } else if ($this->sys == SYS_MAC) { if (isset($_ENV['HOME'])) { //environment variable set $strHome = $_ENV['HOME']; } else { //env not set, so try the default directory $strUser = $this->getUserName(); if ($strUser !== null) { $strHome = '/Users/' . $strUser; } } } else if ($this->sys == SYS_WINDOWS) { $arEnv = $_SERVER + $_ENV; if (isset($arEnv['USERPROFILE'])) { $strHome = $arEnv['USERPROFILE']; } else if (isset($arEnv['HOMEPATH']) && isset($arEnv['HOMEDRIVE'])) { $strHome = $arEnv['HOMEDRIVE'] . $arEnv['HOMEPATH']; } else { //guess it... $strUser = $this->getUserName(); if ($strUser !== null) { //It seems as if the german version of windows is the only //one that translated "docs and settings". All other languages //use the english name $strHome = System_Folders::tryPaths( $this->arDocsAndSettings ) . $strUser; } } $strHome = $this->fixWindowsPath($strHome); }//windows
return $this->addTrailingSlash($strHome); }//function getHome()
/** * Returns the path to the programs directory. * This is the dir where all programs are installed * normally. * * On windows, it's mostly "C:\Programs\", on linux, * the /opt/ directory is returned. * * @return string The programs directory * * @access public */ function getPrograms() { $strPrograms = null;
if ($this->sys == SYS_LINUX) { if (file_exists('/opt/') && is_dir('/opt/')) { $strPrograms = '/opt/'; } } else if ($this->sys == SYS_MAC) { $strPrograms = '/Applications/'; } else if ($this->sys == SYS_WINDOWS) { $strPrograms = $this->getCOMPath('Programs'); if ($strPrograms === false || !file_exists($strPrograms)) { $arEnv = $_SERVER + $_ENV; if (isset($arEnv['ProgramFiles'])) { $strPrograms = $arEnv['ProgramFiles']; } else { //guess it $strPrograms = System_Folders::tryPaths( $this->arProgramsWindows ); }//guess it } $strPrograms = $this->fixWindowsPath($strPrograms); }//windows
return $this->addTrailingSlash($strPrograms); }//function getPrograms()
/** * Returns the path to the directory for temporary files. * * @return string The temporary directory * * @access public */ function getTemp() { $strTemp = null;
if ($this->sys == SYS_LINUX || $this->sys == SYS_MAC) { if (file_exists('/tmp/') && is_dir('/tmp/')) { $strTemp = '/tmp/'; } } else if ($this->sys == SYS_WINDOWS) { $arEnv = $_SERVER + $_ENV; if (isset($arEnv['TEMP'])) { $strTemp = $arEnv['TEMP']; } else if (isset($arEnv['TMP'])) { $strTemp = $arEnv['TMP']; } else { //guess it $strTemp = System_Folders::tryPaths( $this->arWindowsDirs, '', '\\Temp' ); }//no env variable $strTemp = $this->fixWindowsPath($strTemp); }//windows
return $this->addTrailingSlash($strTemp); }//function getTemp()
/** * Returns the path to the shared documents directory. * * Supports windows only (at least for now) as no other * operating system seems to have such a folder. * Returns NULL on failure (not windows or not found). * * @return string The shared documents dir * * @access public */ function getSharedDocuments() { $strShared = null; if ($this->sys == SYS_WINDOWS) { $strAll = $this->getAllUsers(); if ($strAll !== null) { $strShared = System_Folders::tryPaths( $this->arSharedDocumentsWindows, $strAll ); } }
return $this->addTrailingSlash($strShared); }//function getSharedDocuments()
/** * Returns the name of the guesses system. * Can be compared with SYS_* constants. * * @return string The detected system * * @access public */ function getSys() { return $this->sys; }//function getSys()
/** * Returns the name for the user * under which name the program runs. * * This function returns the *system user name*, * not the name with forename and surname * On unix, this would be e.g. 'fbar' or so for * the user 'Foo Bar' * * This method is used my most other methods, so * recognizing the user name is really important. * Be sure to check this method if the others fail. * * @return string The user name * * @access public */ function getUserName() { $strUser = null; if ($this->sys == SYS_LINUX || $this->sys == SYS_MAC ) { if (isset($_ENV['USER'])) { $strUser = $_ENV['USER']; } else { $strUser = trim(`whoami`); } } else if ($this->sys == SYS_WINDOWS) { $arEnv = $_SERVER + $_ENV; if (isset($arEnv['USERNAME'])) { $strUser = $arEnv['USERNAME']; } } return $strUser; }//function getUserName()
/** * Returns the windows directory (if any). * NULL is returned if the system is not Windows. * * @return string The windows directory, NULL if not on windows * * @access public */ function getWindows() { if ($this->sys != SYS_WINDOWS) { return null; }
$strWindows = null; $arEnv = $_SERVER + $_ENV; if (isset($arEnv['SystemRoot'])) { $strWindows = $arEnv['SystemRoot']; } else if (isset($arEnv['windir'])) { $strWindows = $arEnv['windir']; } else { $strWindows = System_Folders::tryPaths($this->arWindowsDirs); }//no env variable
return $this->addTrailingSlash($this->fixWindowsPath($strWindows)); }//function getWindows()
}//class System_Folders ?>
|