Php обозначение текущей директории
dir — Return an instance of the Directory class
Description
A pseudo-object-oriented mechanism for reading a directory. The given directory is opened.
Parameters
Return Values
Returns an instance of Directory , or false in case of error.
Changelog
Examples
Example #1 dir() example
Please note the fashion in which Directory::read() ‘s return value is checked in the example below. We are explicitly testing whether the return value is identical to (equal to and of the same type as — see Comparison Operators for more information) false since otherwise, any directory entry whose name evaluates to false will stop the loop.
$d = dir ( «/etc/php5» );
echo «Handle: » . $d -> handle . «\n» ;
echo «Path: » . $d -> path . «\n» ;
while ( false !== ( $entry = $d -> read ())) echo $entry . «\n» ;
>
$d -> close ();
?>?php
The above example will output something similar to:
Handle: Resource id #2 Path: /etc/php5 . .. apache cgi cli
Notes
Note:
The order in which directory entries are returned by the read method is system-dependent.
User Contributed Notes 20 notes
// simple juste use FilesystemIterator
// and you can skip dot and duble dot
// and use it in array
// new FilesystemIterator( PATH , OPTIONS ) : array
$array_file_list = new FilesystemIterator ( PATH_ROOT . ‘folder/’ , FilesystemIterator :: SKIP_DOTS );
This one’s pretty nice. After getting frustrated for hunting down .jpg files in my massive music collection (PHP would run out of memory), I thought there should be a preg_ls function.
function preg_ls ($path=».», $rec=false, $pat=»/.*/») // it’s going to be used repeatedly, ensure we compile it for speed.
$pat=preg_replace(«|(/.*/[^S]*)|s», «\\1S», $pat);
//Remove trailing slashes from path
while (substr($path,-1,1)==»/») $path=substr($path,0,-1);
//also, make sure that $path is a directory and repair any screwups
if (!is_dir($path)) $path=dirname($path);
//assert either truth or falsehoold of $rec, allow no scalars to mean truth
if ($rec!==true) $rec=false;
//get a directory handle
$d=dir($path);
//initialise the output array
$ret=Array();
//loop, reading until there’s no more to read
while (false!==($e=$d->read())) //Ignore parent- and self-links
if (($e==».»)||($e==»..»)) continue;
//If we’re working recursively and it’s a directory, grab and merge
if ($rec && is_dir($path.»/».$e)) $ret=array_merge($ret,preg_ls($path.»/».$e,$rec,$pat));
continue;
>
//If it don’t match, exclude it
if (!preg_match($pat,$e)) continue;
//In all other cases, add it to the output array
$ret[]=$path.»/».$e;
>
//finally, return the array
return $ret;
>
Not bad for a mere 18 lines, don’t you think?
foreach (preg_ls(«/etc/X11», true, «/.*\.conf/i») as $file) echo $file.»\n»;
Here my solution how to do effective recursiv directory listing.
/**
* example of use:
*/
$d = new RecDir ( «/etc/» , false );
echo «Path: » . $d -> getRootPath () . «\n» ;
while ( false !== ( $entry = $d -> read ())) echo $entry . «\n» ;
>
$d -> close ();
class RecDir
protected $currentPath ;
protected $slash ;
protected $rootPath ;
protected $recursiveTree ;
function __construct ( $rootPath , $win = false )
switch( $win )
case true :
$this -> slash = ‘\\’ ;
break;
default:
$this -> slash = ‘/’ ;
>
$this -> rootPath = $rootPath ;
$this -> currentPath = $rootPath ;
$this -> recursiveTree = array( dir ( $this -> rootPath ));
$this -> rewind ();
>
function __destruct ()
$this -> close ();
>
public function close ()
while( true === ( $d = array_pop ( $this -> recursiveTree )))
$d -> close ();
>
>
public function getRootPath ()
if(isset( $this -> rootPath ))
return $this -> rootPath ;
>
return false ;
>
public function getCurrentPath ()
if(isset( $this -> currentPath ))
return $this -> currentPath ;
>
return false ;
>
public function read ()
while( count ( $this -> recursiveTree )> 0 )
$d = end ( $this -> recursiveTree );
if(( false !== ( $entry = $d -> read ())))
if( $entry != ‘.’ && $entry != ‘..’ )
$path = $d -> path . $entry ;
if( is_file ( $path ))
return $path ;
>
elseif( is_dir ( $path . $this -> slash ))
$this -> currentPath = $path . $this -> slash ;
if( $child = @ dir ( $path . $this -> slash ))
$this -> recursiveTree [] = $child ;
>
>
>
>
else
array_pop ( $this -> recursiveTree )-> close ();
>
>
return false ;
>
public function rewind ()
$this -> closeChildren ();
$this -> rewindCurrent ();
>
public function rewindCurrent ()
return end ( $this -> recursiveTree )-> rewind ();
>
>
?>
Regarding samuel’s comment about the dir() function not supporting Unicode properly, it’s all in the encoding. The function does NOT internally change Unicode characters into question marks (?), as I was first led to believe. If you simply try to output them in UTF-8, they’ll show up just right.
Note that the dir object will use the default encoding for non-unicode programs on Windows with PHP 5.x.
So, if you have a file named with characters unsupported by the current default encoding, the dir->read() method will return a wrong entry.
/*
** This script is on the same directory than a file named with
** unsupported characters for the current default encoding.
*/
$d = dir ( «./» );
while( false !== ( $e = $d -> read ()))
echo $e . ‘
‘ ;
?>
This will print a «?» for every unsupported characters, and not the right file name. So take care if you check with is_file/is_dir right after enumerating.
getcwd
Возвращает текущий рабочий каталог в случае успешного выполнения или false в случае ошибки.
На некоторых вариантах Unix getcwd() вернёт false , если на каком-либо из родительских каталогов не установлен режим чтения или поиска, даже если он установлен на текущем каталоге. Больше информации о режимах доступа смотрите в документации функции chmod() .
Примеры
Пример #1 Пример использования getcwd()
// текущий каталог
echo getcwd () . «\n» ;
// текущий каталог
echo getcwd () . «\n» ;
Результатом выполнения данного примера будет что-то подобное:
Если PHP-интерпретатор собран с поддержкой ZTS (Zend Thread Safety), текущий рабочий каталог, возвращаемый getcwd() , может отличаться от того, что возвращают интерфейсы операционной системы. Буду задействованы внешние библиотеки (подключённые через FFI), использующие текущий рабочий каталог.
Смотрите также
User Contributed Notes 20 notes
getcwd() returns the path of the «main» script referenced in the URL.
dirname(__FILE__) will return the path of the script currently executing.
I had written a script that required several class definition scripts from the same directory. It retrieved them based on filename matches and used getcwd to figure out where they were.
Didn’t work so well when I needed to call that first script from a new file in a different directory.
given a link
/some/link->/some/location/path
with linux bash,
if within the linked drawer /some/link
cd .. goes upper link /some/
cd -P .. goes upper destination /some/location/
with php
fopen («../file») goes upper destination /some/location/file
some others commented about ways obtaining the path below.
I found some luck with using $_SERVER[‘DOCUMENT_ROOT’] instead
to recraft an absolute path.
getcwd() appears to call the equivalent of PHP’s realpath() on the path. It never returns symlinks, but always the actual directory names in the path to the current working directory.
When running PHP on the command line, if you want to include another file which is in the same directory as the main script, doing just
include ‘./otherfile.php’ ;
?>
might not work, if you run your script like this:
/$ /path/to/script.php
because the current working dir will be set to ‘/’, and the file ‘/otherfile.php’ does not exist, because it is in ‘/path/to/otherfile.php’.
So, to get the directory in which the script resides, you can use this function:
function get_file_dir () global $argv ;
$dir = dirname ( getcwd () . ‘/’ . $argv [ 0 ]);
$curDir = getcwd ();
chdir ( $dir );
$dir = getcwd ();
chdir ( $curDir );
return $dir ;
>
?>
So you can use it like this:
include get_file_dir () . ‘/otherfile.php’ ;
// or even..
chdir ( get_file_dir ());
include ‘./otherfile.php’ ;
?>
Spent some time thinking this one out, maybe it helps someone 🙂
I use this code to replicate the pushd and popd DOS commands in PHP:
$g_DirStack = array();
function pushd ( $dir )
global $g_DirStack ;
array_push ( $g_DirStack , getcwd () );
chdir ( $dir );
>
function popd ( )
global $g_DirStack ;
$dir = array_pop ( $g_DirStack );
assert ( $dir !== null );
chdir ( $dir );
>
?>
This allows you to change the current directory with pushd, then use popd to «undo» the directory change when you’re done.
This function is often used in conjuction with basename(), i.e.
http://www.php.net/manual/en/function.basename.php
Some server’s has security options to block the getcwd()
«On some Unix variants, getcwd() will return FALSE if any one of the parent directories does not have the readable or search mode set, even if the current directory does.»
Just so you know, MacOS X is one of these variants (at least 10.4 is for me). You can make it work by applying ‘chmod a+rx’ to all folders from your site folder upwards.
This is a function to convert a path which looks something like this:
To a proper directory path:
function simplify_path ( $path )
//saves our current working directory to a variable
$oldcwd = getcwd ();
//changes the directory to the one to convert
//$path is the directory to convert (clean up), handed over to the //function as a string
chdir ( $path );
return gstr_replace ( ‘\\’ , ‘/’ , getcwd ());
//change the cwd back to the old value to not interfere with the script
chdir ( $oldcwd );
This function is really useful if you want to compare two filepaths which are not necesarily in a «cleaned up» state . It works in * NIX and WINDOWS alike
if you link your php to /bin/linkedphp and your php is at for ex /home/actual.php
when you run linkedphp in somewhere in your filesystem,
getcwd returns /bin instead of working dir,
solution: use dirname(__FILENAME__) instead
It appears there is a change in functionality in PHP5 from PHP4 when using the CLI tool. Here is the example: —
PHP4 returns /tmp
PHP5 returns /
Take care if you use getcwd() in file that you’ll need to include (using include, require, or *_once) in a script located outside of the same directory tree.
example:
//in /var/www/main_document_root/include/MySQL.inc.php
if ( strpos ( getcwd (), ‘main_’ )> 0 ) //code to set up main DB connection
>
?>
//in home/cron_user/maintenance_scripts/some_maintenance_script.php
require_once ( ‘/var/www/main_document_root/include/MySQL.inc.php’ );
?>
In the above example, the database connection will not be made because the call to getcwd() returns the path relative to the calling script ( /home/cron_user/maintenance_scripts ) NOT relative to the file where the getcwd() function is called.
Be aware when calling getcwd() in directories consisting of symlinks.
getcwd() is the equivalent of shell command «pwd -P» which resolves symlinks.
The shell command «pwd» is the equivalent of «pwd -L» which uses PWD from the environment without resolving symlinks. This is also the equivalent of calling getenv(‘PWD’).
As you could read in
http://www.php.net/manual/en/features.commandline.differences.php
the CLI SAPI does — contrary to other SAPIs — NOT automatically change the current working directory to the one the started script resides in.
A very simple workaround to regain the behaviour you’re used to from your «ordinary» webpage scripting is to include something like that at the beginning of your script:
chdir ( dirname ( __FILE__ ) );
?>
But because this is about reading or «finding» pathes, you might appreciate it if I share some more sophisticated tricks I frequently use in CLI scripts .
// Note: all pathes stored in subsequent Variables end up with a DIRECTORY_SEPARATOR
// how to store the working directory «from where» the script was called:
$initial_cwd = preg_replace ( ‘~(\w)$~’ , ‘$1’ . DIRECTORY_SEPARATOR , realpath ( getcwd () ) );
// how to switch symlink-free to the folder the current file resides in:
chdir ( dirname ( realpath ( __FILE__ ) ) );
// how to store the former folder in a variable:
$my_folder = dirname ( realpath ( __FILE__ ) ) . DIRECTORY_SEPARATOR ;
// how to get a path one folder up if $my_folder ends with \class\ or /class/ :
$my_parent_folder = preg_replace ( ‘~[/\\\\]class[/\\\\]$~’ , DIRECTORY_SEPARATOR , $my_folder );
// how to get a path one folder up in any case :
$my_parent_folder = preg_replace ( ‘~[/\\\\][^/\\\\]*[/\\\\]$~’ , DIRECTORY_SEPARATOR , $my_folder );
// how to make an array of OS-style-pathes from an array of unix-style-pathes
// (handy if you use config-files or so):
foreach( $unix_style_pathes as $unix_style_path )
$os_independent_path [] = str_replace ( ‘/’ , DIRECTORY_SEPARATOR , $unix_style_path );