I just learned that, to specify file names in a portable manner, you DON'T need 'DIRECTORY_SEPARATOR' - just use '/'. This really surprised and shocked me, as until now I typed about a zillion times 'DIRECTORY_SEPARATOR' to stay platform independent - unnecessary. Don't make the same mistake.
XL. Funkce filesystému
Úvod
Požadavky
Pro toto rozšíření nejsou třeba žádné externí knihovny, ale jestliže chcete, aby PHP na Linuxu podporovalo LFS (velké soubory), potřebujete aktuální knihovnu glibc a musíte PHP zkompilovat s těmito přepínači překladače: -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.
Instalace
K používání těchto funkcí není třeba žádná instalace, jsou součástí jádra PHP.
Konfigurace běhu
Chování těchto funkcí je ovlivněno nastavením parametrů v php.ini.
Tabulka 82. Filesystem and Streams Configuration Options
| Name | Default | Changeable | Changelog |
|---|---|---|---|
| allow_url_fopen | "1" | PHP_INI_SYSTEM | PHP_INI_ALL in PHP <= 4.3.4. Available since PHP 4.0.4. |
| allow_url_include | "0" | PHP_INI_SYSTEM | Available since PHP 5.2.0. |
| user_agent | NULL | PHP_INI_ALL | Available since PHP 4.3.0. |
| default_socket_timeout | "60" | PHP_INI_ALL | Available since PHP 4.3.0. |
| from | "" | PHP_INI_ALL | |
| auto_detect_line_endings | "0" | PHP_INI_ALL | Available since PHP 4.3.0. |
Zde je stručný popis konfiguračních direktiv.
- allow_url_fopen boolean
This option enables the URL-aware fopen wrappers that enable accessing URL object like files. Default wrappers are provided for the access of remote files using the ftp or http protocol, some extensions like zlib may register additional wrappers.
Poznámka: This setting can only be set in php.ini due to security reasons.
Poznámka: This option was introduced immediately after the release of version 4.0.3. For versions up to and including 4.0.3 you can only disable this feature at compile time by using the configuration switch --disable-url-fopen-wrapper.
VarováníOn Windows versions prior to PHP 4.3.0, the following functions do not support remote file accessing: include(), include_once(), require(), require_once() and the imagecreatefromXXX functions in the Image extension.
- allow_url_include boolean
This option allows the use of URL-aware fopen wrappers with the following functions: include(), include_once(), require(), require_once().
Poznámka: This setting requires allow_url_fopen to be on.
- user_agent string
Define the user agent for PHP to send.
- default_socket_timeout integer
Default timeout (in seconds) for socket based streams.
Poznámka: This configuration option was introduced in PHP 4.3.0
- from string
Define the anonymous ftp password (your email address).
- auto_detect_line_endings boolean
When turned on, PHP will examine the data read by fgets() and file() to see if it is using Unix, MS-Dos or Macintosh line-ending conventions.
This enables PHP to interoperate with Macintosh systems, but defaults to Off, as there is a very small performance penalty when detecting the EOL conventions for the first line, and also because people using carriage-returns as item separators under Unix systems would experience non-backwards-compatible behaviour.
Poznámka: This configuration option was introduced in PHP 4.3.0
Typy prostředků
Předdefinované konstanty
Tyto konstanty jsou definovány tímto rozšířením a budou k dispozici pouze tehdy, bylo-li rozšíření zkompilováno společně s PHP nebo dynamicky zavedeno za běhu.
- GLOB_BRACE (integer)
- GLOB_ONLYDIR (integer)
- GLOB_MARK (integer)
- GLOB_NOSORT (integer)
- GLOB_NOCHECK (integer)
- GLOB_NOESCAPE (integer)
- PATHINFO_DIRNAME (integer)
- PATHINFO_BASENAME (integer)
- PATHINFO_EXTENSION (integer)
- PATHINFO_FILENAME (integer)
- Since PHP 5.2.0.
- FILE_USE_INCLUDE_PATH (integer)
- FILE_APPEND (integer)
- FILE_IGNORE_NEW_LINES (integer)
- FILE_SKIP_EMPTY_LINES (integer)
Viz také
Pro příbuzné funkce viz také sekce Adresáře a Spouštění programů.
Pro seznam a vysvětlení různých URL wrapperů, které mohou být použity jako vzdálené soubory, viz také sekci N – „List of Supported Protocols/Wrappers“.
Obsah
- basename — Vrátí část cesty obsahující název souboru
- chgrp — Změnit skupinu souboru
- chmod — Změnit mód souboru
- chown — Změní vlastníka souboru
- clearstatcache — Vymaže cache stavu souborů
- copy — Zkopíruje soubor
- delete — Falešná položka manuálu
- dirname — Vrací část cesty obsahující název adresáře
- disk_free_space — Returns available space in directory
- disk_total_space — Returns the total size of a directory
- diskfreespace — Vrátí diskový prostor dostupný v adresáři
- fclose — Zavře otevřený deskriptor souboru
- feof — Test na konec souboru
- fflush — Zapíše obsah výstupního bufferu
- fgetc — Načte 1 znak ze souboru
- fgetcsv — Načte řádek ze souboru a parsuje ho na CSV hodnoty
- fgets — Přečte řádek ze souboru
- fgetss — Přečte řádek ze souboru a odstraní HTML značky
- file_exists — Zjistí, zda soubor nebo adresář existuje
- file_get_contents — Reads entire file into a string
- file_put_contents — Write a string to a file
- file — Načte celý soubor do pole
- fileatime — Vrací čas posledního přístupu k souboru
- filectime — Vrací čas změny inodu souboru
- filegroup — Vrací skupinu pro soubor
- fileinode — Vrací inode souboru
- filemtime — Vrací čas změny souboru
- fileowner — Vrací vlastníka souboru
- fileperms — Vrací přístupová práva k souboru
- filesize — Vrací velikost souboru
- filetype — Vrací typ souboru
- flock — Jednotné "portable advisory" zamykání souboru
- fnmatch — Match filename against a pattern
- fopen — Otevře soubor nebo URL
- fpassthru — Vypíše všechna zbývající data v souboru
- fputcsv — Format line as CSV and write to file pointer
- fputs — Zapíše do souboru
- fread — Binárně bezpečné čtení ze souboru
- fscanf — Parsuje vstup ze souboru podle formátu
- fseek — Posouvá ukazatel v souboru
- fstat — Vrací informace o otevřeném souboru
- ftell — Vrací pozici v souboru
- ftruncate — Zkrátí soubor na danou délku
- fwrite — Binárně bezpečný zápis do souboru
- glob — Find pathnames matching a pattern
- is_dir — Zjistí, zda je daný soubor adresářem
- is_executable — Zjistí, zda je soubor spustitelný
- is_file — Zjistí, zda se jedná o obyčejný (regular) soubor
- is_link — Zjistí, zda se jedná o symbolický odkaz (link)
- is_readable — Zjistí, zda lze ze souboru číst
- is_uploaded_file — Zjistí, zda byl soubor uploadován pomocí HTTP POST
- is_writable — Zjistí, zda lze do souboru zapisovat
- is_writeable — Alias pro is_writable()
- lchgrp — Changes group ownership of symlink
- lchown — Changes user ownership of symlink
- link — Vytvoří hard link
- linkinfo — Vrací informaci o odkazu (linku)
- lstat — Zjišťuje informace o souboru nebo symbolickém odkazu
- mkdir — Vytvoří adresář
- move_uploaded_file — Přesune uploadovaný soubor na nové místo
- parse_ini_file — Parse a configuration file
- pathinfo — Returns information about a file path
- pclose — Zavře procesový soubor (rouru)
- popen — Otevře procesový soubor (rouru)
- readfile — Vypíše soubor
- readlink — Vrací cíl symbolického odkazu
- realpath — Vrátí absolutní cestu v kanonickém tvaru
- rename — Přejmenuje soubor
- rewind — Vrátí ukazatel v souboru na začátek
- rmdir — Odstraní adresář
- set_file_buffer — Nastaví buffer pro soubor
- stat — Zjišťuje informace o souboru
- symlink — Vytvoří symbolický odkaz
- tempnam — Vytvoří soubor s unikátním názvem
- tmpfile — Vytvoří dočasný soubor
- touch — Nastavit čas změny souboru
- umask — Změní současné nastavení umask
- unlink — Smazat soubor
Funkce filesystému
17-Mar-2007 10:24
25-Feb-2005 08:27
I made this function to search and/or display files by extension or for a string occurance in the filename. Any comments or enhancements are welcome offcourse. I'll update this function soon.
usage: list_files([string], [string], [int 1 | 0], [int 1 | 0]);
search for extension: list_files([string], [string], [0], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [0], [0]);
echo result: list_files([string], [string], [0], [1]);
search for string occurance: list_files([string], [string], [1], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [1], [0]);
echo result: list_files([string], [string], [1], [1]);
<?php
function list_files($directory, $stringSearch, $searchHandler, $outputHandler) {
$errorHandler = false;
$result = array();
if (! $directoryHandler = @opendir ($directory)) {
echo ("<pre>\nerror: directory \"$directory\" doesn't exist!\n</pre>\n");
return $errorHandler = true;
}
if ($searchHandler === 0) {
while (false !== ($fileName = @readdir ($directoryHandler))) {
if(@substr ($fileName, - @strlen ($stringSearch)) === $stringSearch) {
@array_push ($result, $fileName);
}
}
}
if ($searchHandler === 1) {
while(false !== ($fileName = @readdir ($directoryHandler))) {
if(@substr_count ($fileName, $stringSearch) > 0) {
@array_push ($result, $fileName);
}
}
}
if (($errorHandler === true) && (@count ($result) === 0)) {
echo ("<pre>\nerror: no filetype \"$fileExtension\" found!\n</pre>\n");
}
else {
sort ($result);
if ($outputHandler === 0) {
return $result;
}
if ($outputHandler === 1) {
echo ("<pre>\n");
print_r ($result);
echo ("</pre>\n");
}
}
}
?>
30-Dec-2003 04:39
Here is a function I wrote to get the relative path between 2 files or directory.
We suppose that paths are wrotten in Unix format (/ instead of windows \\)
<?php
/**
* Return the relative path between two paths / Retourne le chemin relatif entre 2 chemins
*
* If $path2 is empty, get the current directory (getcwd).
* @return string
*/
function relativePath($path1, $path2='')
{
if ($path2 == '') {
$path2 = $path1;
$path1 = getcwd();
}
//Remove starting, ending, and double / in paths
$path1 = trim($path1,'/');
$path2 = trim($path2,'/');
while (substr_count($path1, '//')) $path1 = str_replace('//', '/', $path1);
while (substr_count($path2, '//')) $path2 = str_replace('//', '/', $path2);
//create arrays
$arr1 = explode('/', $path1);
if ($arr1 == array('')) $arr1 = array();
$arr2 = explode('/', $path2);
if ($arr2 == array('')) $arr2 = array();
$size1 = count($arr1);
$size2 = count($arr2);
//now the hard part :-p
$path='';
for($i=0; $i<min($size1,$size2); $i++)
{
if ($arr1[$i] == $arr2[$i]) continue;
else $path = '../'.$path.$arr2[$i].'/';
}
if ($size1 > $size2)
for ($i = $size2; $i < $size1; $i++)
$path = '../'.$path;
else if ($size2 > $size1)
for ($i = $size1; $i < $size2; $i++)
$path .= $arr2[$i].'/';
return $path;
}
?>
Enjoy ! :-)
22-Aug-2003 05:23
This function searches a directory and returns an array of all files whose filename matches the specified regular expression. It's similar in concept to the Unix find program.
function findfile($location='',$fileregex='') {
if (!$location or !is_dir($location) or !$fileregex) {
return false;
}
$matchedfiles = array();
$all = opendir($location);
while ($file = readdir($all)) {
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
$subdir_matches = findfile($location.'/'.$file,$fileregex);
$matchedfiles = array_merge($matchedfiles,$subdir_matches);
unset($file);
}
elseif (!is_dir($location.'/'.$file)) {
if (preg_match($fileregex,$file)) {
array_push($matchedfiles,$location.'/'.$file);
}
}
}
closedir($all);
unset($all);
return $matchedfiles;
}
$htmlfiles = findfile('/some/dir','/\.(htm|html)$/');
16-Jul-2003 10:25
I needed a function to find disk usage for a directory and its subs, so here it is. It's kinda like the Unix du program, except it returns the usage in bytes, not blocks.
function du($location) {
if (!$location or !is_dir($location)) {
return 0;
}
$total = 0;
$all = opendir($location);
while ($file = readdir($all)) {
if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
$total += du($location.'/'.$file);
unset($file);
}
elseif (!is_dir($location.'/'.$file)) {
$stats = stat($location.'/'.$file);
$total += $stats['size'];
unset($file);
}
}
closedir($all);
unset($all);
return $total;
}
print du('/some/directory');
03-Jul-2003 10:25
In the code samples of the user-contributed notes, you'll find functions that sometimes need a slash at the end of a folder path and sometimes don't.
Here's a little function to append a slash at the end of a path if there isn't one already.
function append_slash_if_none($string)
{
if (ereg ("/$", $string))
{
return $string;
}
else
{
return ereg_replace("$", "/", $string);
}
}
(Replace with a backslash if you're on Windows...)
15-May-2003 10:10
Pollard@php.net contributed this in response to a question on setting these variables ...
This option *IS* settable within your PHP scripts.
Example:
<?php
ini_set('auto_detect_line_endings', true);
$contents = file('unknowntype.txt');
ini_set('auto_detect_line_endings', false);
$content2 = file('unixfile.txt');
?>
Note, with PHP 4.3 anytime Mac files are read using fgets or file you'll need to auto_detect_line_endings since \n is otherwise assumed. However, with PHP 5.0, stream_get_line() will allow you to specify what line ending character to read up to.
\\ Read a line from a MAC file
stream_get_line($fp, 4096, "\r");
\\ Read a line from a UNIX file
stream_get_line($fp, 4096, "\n");
\\ Read a line from a DOS file
stream_get_line($fp, 4096, "\r\n");
\\ Read a line up to any filesystem line ending
ini_set('auto_detect_line_endings', true); fgets($fp);
\\ You can also make up your own line ending characters:
\\ Read up to the first instance of ":"
stream_get_line($fp, 4096, ":");
03-Apr-2003 07:49
Here is a useful function if you're having trouble writing raw bytes into a file.
It receives an integer and returns an array containing the ASCII values of the bytes on each index of the array.
function int2bytes($number){
$byte = $number;
$i=0;
do{
$dec_tmp = $byte;
$byte = bcdiv($byte,256,0);
$resto = $dec_tmp - (256 * $byte);
$return[] = $resto;
} while($byte >= 256);
if($byte) $return[] = $byte;
return array_reverse($return);
}
Example:
$arr = int2bytes(75832);
$arr will contain the following values:
Array
(
[0] => 1
[1] => 40
[2] => 56
)
Now, to write this data to the file, just use a fputs() with chr(), just like this:
fputs($fp,chr($arr[0]).chr($arr[1]).chr($arr[2]))
-- Regis
08-Mar-2003 07:18
This is a function I use to determine if a file contains Binary information. I use this for my search engine so that it doesn't try to index files like .zip or .mp3 or any other file that doesn't contain readable information. It makes use of the Character Type Extension if it's loaded, if it's not then it uses Regular Expressions.
function is_binary($link)
{
$tmpStr = '';
@$fp = fopen($link, 'rb');
@$tmpStr = fread($fp, 256);
@fclose($fp);
if($tmpStr != '')
{
$tmpStr = str_replace(chr(10), '', $tmpStr);
$tmpStr = str_replace(chr(13), '', $tmpStr);
$tmpInt = 0;
for($i =0; $i < strlen($tmpStr); $i++)
{
if( extension_loaded('ctype') )
{
if( !ctype_print($tmpStr[$i]) )
$tmpInt++;
}
else
{
if( !eregi("[[:print:]]+", $tmpStr[$i]) )
$tmpInt++;
}
}
if($tmpInt > 5)
return(0);
else
return(1);
}
else
return(0);
}
