Current File : //opt/RZphp72/includes/System/Folders.php |
<?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
?>