|
 |
XXXVIII. Функции для работы с файловой системой
Никакие внешние библиотеки не требуются для сборки этого расширения,
но если вы хотите, чтобы PHP поддерживал LFS (large files, большие файлы)
в Linux, вам нужно иметь последнюю версию glibc и скомпилировать PHP со
следующими флагами компилятора:
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.
Для использования этих функций не требуется проведение установки,
поскольку они являются частью ядра PHP.
Поведение этих функций зависит от установок в php.ini.
Таблица 1. Директивы конфигурации для файловых систем и потоков Имя | Значение по умолчанию | Область изменения |
---|
allow_url_fopen | "1" | PHP_INI_SYSTEM | user_agent | NULL | PHP_INI_ALL | default_socket_timeout | "60" | PHP_INI_ALL | from | NULL | ?? | auto_detect_line_endings | "Off" | PHP_INI_ALL |
Краткое разъяснение конфигурационных
директив.
- allow_url_fopen
boolean
Данная директива включает поддержку упаковщиков URL (URL wrappers),
которые позволяют работать с объектами URL, как с обычными файлами.
Упаковщики, доступные по умолчанию, служат для работы с
удаленными файлами
с использованием протокола ftp или http. Некоторые расширения,
например, zlib, могут регистрировать
собственные упаковщики.
Замечание:
Эта настройка может быть установлена только в php.ini из соображений безопасности.
Замечание:
Эта директива была представлена сразу же после выхода PHP версии
4.0.3. В этой и в последующих версиях эта функциональность
может быть отключена только во время компиляции PHP с помощью
ключа
--disable-url-fopen-wrapper.
- user_agent
string
Устанавливает строку "User-Agent" для использования ее PHP
при запросах к удаленным серверам.
- default_socket_timeout
integer
Значение таймаута (в секундах) для потоков, использующих сокеты.
Замечание:
Данная директива стала доступна с версии PHP 4.3.0
- from="joe@example.com"
string
Устанавливает пароль для анонимного доступа к серверу ftp (ваш адрес электронной почты).
- auto_detect_line_endings
boolean
Когда данная директива включена, PHP проверяет данные,
получаемые функциями fgets() и file()
с тем, чтобы определить способ завершения строк (Unix, MS-Dos или Macintosh).
Данная директива позволяет PHP взаимодействовать с системами
Macintosh, однако, по умолчанию эта директива выключена,
поскольку при ее использовании возникает (несущественная)
потребность в дополнительных ресурсах для определения
символа окончания первой строки, а также потому, что
программисты, использующие в системах Unix символы перевода строки
в качестве разделителей, столкнутся с обратно-несовместимым поведением PHP.
Замечание:
Эта директива стала доступна с версии PHP 4.3.0
Перечисленные ниже константы определены данным расширением и могут быть
доступны только в том случае, если PHP был собран с
поддержкой этого расширения или же в том случае, если
данное расширение подгружается во время выполнения.
- Содержание
- basename -- Возвращает имя файла из указанного пути
- chgrp -- Изменяет группу владельцев файла
- chmod -- Изменяет режим доступа к файлу или каталогу
- chown -- Изменяет владельца файла
- clearstatcache -- Очищает кэш состояния файлов
- copy -- Копирует файл
- delete -- См.описание функции unlink() или unset()
- dirname -- Возвращает имя каталога из указанного пути
- disk_free_space -- Получить размер доступного пространства в каталоге
- disk_total_space -- Возвращает объем каталога
- diskfreespace -- Псевдоним функции disk_free_space()
- fclose -- Закрывает дескриптор файла
- feof -- Проверяет, достигнут ли конец файла
- fflush -- Сброс буфера вывода в файл
- fgetc -- Считывает символ из файла
- fgetcsv -- Читает строку из файла и производит разбор данных CSV
- fgets -- Читает строку из файла
- fgetss -- Прочитать строку из файла и отбросить HTML-теги
- file_exists -- Проверить наличие указанного файла или каталога
- file_get_contents -- Получить содержимое файла в виде одной строки
- file_put_contents -- Записать строку в файл
- file -- Читает содержимое файла и помещает его в массив
- fileatime -- Получить время последнего доступа к файлу
- filectime -- Получить время последнего изменения i-узла
- filegroup -- Получить идентификатор группы файла
- fileinode -- Получить номер inode файла
- filemtime -- Получить время последнего изменения файла
- fileowner -- Получить идентификатор владельца файла
- fileperms -- Получить информацию о правах на файл
- filesize -- Получить размер файла
- filetype -- Получить тип файла
- flock -- Портируемое рекомендательное запирание файлов
- fnmatch -- Совпадает ли имя файла с шаблоном
- fopen -- Открывает файл или URL
- fpassthru -- Выводит все оставшиеся данные из файлового указателя
- fputcsv --
Форматирует строку в виде CSV и записывает её в файловый указатель
- fputs -- Псевдоним функции fwrite()
- fread -- Бинарно-безопасное чтение файла
- fscanf -- Обрабатывает данные из файла в соответствии с форматом
- fseek -- Устанавливает смещение в файловом указателе
- fstat -- Получает информацию о файле используя открытый файловый указатель
- ftell -- Сообщает текущее смещение чтения/записи файла
- ftruncate -- Урезает файл до указанной длинны
- fwrite -- Бинарно-безопасная запись в файл
- glob -- Находит файловые пути, совпадающие с шаблоном
- is_dir -- Определает, является ли файл директорией
- is_executable -- Определяет, является ли файл исполняемым
- is_file -- Определяет, является ли файл обычным файлом
- is_link -- Определяет, является ли файл символической ссылкой
- is_readable -- Определяет, доступен ли файл для чтения
- is_uploaded_file -- Определяет, был ли файл загружен при помощи HTTP POST
- is_writable -- Определяет, доступен ли файл для записи
- is_writeable -- Псевдоним функции is_writable()
- link -- Создаёт жёсткую ссылку
- linkinfo -- Получает информацию о ссылке
- lstat -- Получает информацию о файле или символической ссылке
- mkdir -- Создаёт директорию
- move_uploaded_file -- Перемещает загруженный файл в новое место
- parse_ini_file -- Обрабатывает конфигурационный файл
- pathinfo -- Возвращает информацию о пути к файлу
- pclose -- Закрывает файловый указатель процесса
- popen -- Открывает файловый указатель процесса
- readfile -- Выводит файл
- readlink -- Возвращает файл, на который указывает символическая ссылка
- realpath -- Возвращает канонизированный абсолютный путь к файлу
- rename -- Переименовывает файл или директорию
- rewind -- Сбрасывает курсор у файлового указателя
- rmdir -- Удаляет директорию
- set_file_buffer -- Псевдоним функции stream_set_write_buffer()
- stat -- Получает информацию о файле
- symlink -- Создаёт символическую ссылку
- tempnam -- Создаёт файл с уникальным именем
- tmpfile -- Создаёт временный файл
- touch -- Устанавливает время доступа и модификации файла
- umask -- Изменяет текущую umask
- unlink -- Удаляет файл
Функции для работы с файловой системой
tim at astolat dot it
04-Jun-2006 08:16
Sorry, important typo in previous post:
$dodgychars = "[^0-9a-zA-z()_-]";
should be (notice captial Z)
$dodgychars = "[^0-9a-zA-Z()_-]";
tim at astolat dot it
03-Jun-2006 11:03
Little function to sanitize a user supplied file name, and optionally force a file extension:
function sanitize_filename($filename, $forceextension="")
{
/*
1. Remove leading and trailing dots
2. Remove dodgy characters from filename, including spaces and dots except last.
3. Force extension if specified
*/
$defaultfilename = "none";
$dodgychars = "[^0-9a-zA-z()_-]"; // allow only alphanumeric, underscore, parentheses and hyphen
$filename = preg_replace("/^[.]*/","",$filename); // lose any leading dots
$filename = preg_replace("/[.]*$/","",$filename); // lose any trailing dots
$filename = $filename?$filename:$defaultfilename; // if filename is blank, provide default
$lastdotpos=strrpos($filename, "."); // save last dot position
$filename = preg_replace("/$dodgychars/","_",$filename); // replace dodgy characters
$afterdot = "";
if ($lastdotpos !== false) { // Split into name and extension, if any.
$beforedot = substr($filename, 0, $lastdotpos);
if ($lastdotpos < (strlen($filename) - 1))
$afterdot = substr($filename, $lastdotpos + 1);
}
else // no extension
$beforedot = $filename;
if ($forceextension)
$filename = $beforedot . "." . $forceextension;
elseif ($afterdot)
$filename = $beforedot . "." . $afterdot;
else
$filename = $beforedot;
return $filename;
}
echo sanitize_filename("..file<>@**()name.ddd.badextension", "extension")."\n";
echo sanitize_filename("..file<>@**()name.extension.ddd")."\n";
echo sanitize_filename("...", "extension")."\n";
echo sanitize_filename("...")."\n";
echo sanitize_filename("filename")."\n";
echo sanitize_filename("filename", "extension")."\n";
echo sanitize_filename(".xyz...xxx..", "extension")."\n";
echo sanitize_filename(".xyz...xxx..", "")."\n";
produces
file_____()name_ddd.extension
file_____()name_extension.ddd
none.extension
none
filename
filename.extension
xyz__.extension
xyz__.xxx
codatrix at yahoo dot com
05-Apr-2006 09:58
The following underlisted function called "fcountext" is a function I wrote, for counting the number of file extensions within a given directory. Hope you find it satisfactory as there is no alternative solution via PHP's core filesystem's functions for counting the number of file extensions within a given directory.
<?php
function fcountext($dir)
{
if(is_dir($dir)) {
$dp = opendir($dir);
$afile = array();
$i = 0;
while($content = readdir($dp)) {
$filepath = $dir.$content;
if(!count($afile)) {
if(is_file($filepath)) {
$pathinfo = pathinfo($filepath);
$afile[$i] = $pathinfo['extension'];
}
} else {
if(is_file($filepath)) {
$pathinfo = pathinfo($filepath);
$len = count($afile);
for($i=0; $i<$len; $i++) {
if($afile[$i] != $pathinfo['extension']) $stat = 'T';
else {
$stat = 'F';
break;
}
}
if($stat == 'T') {
$afile[$len] = $pathinfo['extension'];
}
}
}
}
$extnum = count($afile);
return $extnum;
closedir($dp);
} else {
return 'Invalid Directory';
}
}
?>
The above function can be incorporated as you deem fit into a class situation to be accessed publicly.
wsuttonjr at hyponiqs dot com
15-Oct-2005 12:26
Here's a little function I wrote that I thought someone might find useful. Ever notice those fancy breadcrumbed headings on Web sites such as Macromedia.com? Ever say, "I want one, but I don't want to write the HTML in each time?" Well, here you go. This does that based on your directory structure.
Do note, however, that it only works if you use files and folders that are named like:
/my-folder/my-file.php
/my_folder/my_file.php
/My_Folder/My_File.php
/My-Folder/My-File.php
...and the variable <i>$path</i> must be similarly formatted. A preceding forward slash (/) must be on that <i>$path</i>. $_SERVER['PHP_SELF'], $_SERVER['DOCUMENT_ROOT'], and other $_SERVER variables always add that.
When I have some free time (sooner rather than later), I'm going to write a more in-depth script for this. I just needed something simple for now. You can expect a PHP 4 and PHP 5 script class dedicated to this one idea. For now, this simple function does the trick. Anyway, here you go:
<?php
function breadCrumbs($path)
{
$dirIndex = 'Home.php';
$dirIndexName = 'Home';
$file = basename($path, '.php');
$dir = dirname($path);
$dir = str_replace('\\', '/', $dir);
$dir = substr($dir, 1, strlen($dir));
$dir .= '/ ';
$dirs = preg_split('@\/@', $dir);
$lastIndex = count($dirs) - 1;
if ($dirs[$lastIndex] == '' || is_null($dirs[$lastIndex])) {
unset($dirs[$lastIndex]);
}
if ($dirs[$lastIndex] == ' ') {
unset($dirs[$lastIndex]);
}
$dirCount = count($dirs);
$link = '/';
$links = array();
for ($i = 0; $i < count($dirs); $i++) {
$link .= ucwords(preg_replace('@(-|_)@', ' ', $dirs[$i])) . '/';
$links[$i]['href'] = $link . $dirIndex;
$links[$i]['name'] = ucwords($dirs[$i]);
}
$breadcrumbs = array();
for ($i = 0; $i < count($links); $i++) {
$breadcrumbs[$i] = '<a href="' . $links[$i]['href'] . '">' . $links[$i]['name'] . '</a>';
}
if ($dirs[0] == '' || empty($dirs[0])) {
$breadcrumb = $file;
} else {
$breadcrumb = '<a href="/' . $dirIndex . '">' . $dirIndexName . '</a> — ' . join($breadcrumbs, ' > ');
$breadcrumb .= ' > ' . $file;
}
return $breadcrumb;
}
?>
Ciprian Danea, cipriandanea at yahoo dot com
28-Jul-2005 07:28
Here is a little script that will enumerate a directory (given as a string) recursively.
The main working function is get_dir($path,$max_depth='')
Optional aguments:
$max_depth : obvious it'll limit the recursive depth.
Not so optional:
$l=0 : the first call must omit this, or explicitly set it to 0, since it represents the starting depth
$total='': the current total filesize; it should also be left alone, although it autosets itself to 0 on the first call;
In order to do something with the files other than just echoing them, simply replace the echo functions with your own;
Thanks to:
dave at birko dot cjb dot net (for the nice filesize function)
vbwebprofi at gmx dot de (for the fileperms function)
function get_dir($path,$max_depth='',$l=0,$total=''){
if(!is_dir($path))return;
$path=substr($path,-1)!="/"?$path."/":$path;
if(!$l){
echo "\nEnumerating directory $path :\n\n";
$total=0;
}
if($max_depth==='' || ($max_depth>$l && is_int($max_depth))) $test_depth=true;
else $test_depth=false;
$pre="";
$c=$l;
while($c--)$pre.="\t";
$dir=opendir($path);
while($f=readdir($dir)){
if($f=="."||$f=="..")continue;
$file=$path.$f;
$size="";
if(is_file($file)||!is_dir($file)){
$s=filesize($file);
$total+=$s;
$size="[ ".fsize($s)." ]";
}
else $f.="/";
while(strlen($size)<16)
$size=" ".$size;
echo "\n".get_permissions(fileperms($file)).$size.$pre."\t".$f;
if(is_dir($file) && $test_depth)
$total=get_dir($file,$max_depth,$l+1,$total);
}
if(!$l)
echo "\n\nTotal size: ".fsize($total);
return $total;
}
function get_permissions($fperms) {
$out;
if($fperms & 0x1000) // FIFO pipe
$out = 'p';
elseif($fperms & 0x2000) // Character outecial
$out = 'c';
elseif($fperms & 0x3000) // Socket [ original value 0xD000, wrong for linux, but this is also registering as a directory... ant ideas?]
$out = 's';
elseif($fperms & 0x4000) // Directory
$out = 'd';
elseif($fperms & 0x6000) // Block outecial
$out = 'b';
elseif($fperms & 0x8000) // Regular
$out = '-';
elseif($fperms & 0xA000) // Symbolic Link
$out = 'l';
else // UNKNOWN
$out = 'u';
// owner
$out .= (($fperms & 0x0100) ? 'r' : '-') .
(($fperms & 0x0080) ? 'w' : '-') .
(($fperms & 0x0040) ? (($fperms & 0x0800) ? 's' : 'x' ) :
(($fperms & 0x0800) ? 'S' : '-'));
// group
$out .= (($fperms & 0x0020) ? 'r' : '-') .
(($fperms & 0x0010) ? 'w' : '-') .
(($fperms & 0x0008) ? (($fperms & 0x0400) ? 's' : 'x' ) :
(($fperms & 0x0400) ? 'S' : '-'));
// world
$out .= (($fperms & 0x0004) ? 'r' : '-') .
(($fperms & 0x0002) ? 'w' : '-') .
(($fperms & 0x0001) ? (($fperms & 0x0200) ? 't' : 'x' ) :
(($fperms & 0x0200) ? 'T' : '-'));
return $out;
}
function fsize($size) {
$a = array("B", "KB", "MB", "GB", "TB", "PB");
$pos = 0;
while ($size >= 1024) {
$size /= 1024;
$pos++;
}
return round($size,2)." ".$a[$pos];
}
//usage example
get_dir("/tmp/"); // full depth
get_dir("/tmp/",4); //maximum depth set to 4
28-May-2005 12:17
Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.)
hans at lintoo dot dk
22-Mar-2005 08:41
PHP5 Object File
I couldn't find a File Object in PHP5, so I decided to create one myself.
When a function that needs a path requires the file it will output a temp file and return the path to it, so that ie. parse_ini_file will work with the file object using:
<?php
parse_ini_file($myFile->requireFilePath());
?>
It is avaible for download at:
http://www.lintoo.dk/public/dbase_and_file_class.zip
Hans Duedal
tunnelareaten at gmail dot com
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");
}
}
}
?>
ben at nullcreations dot net
14-Nov-2004 02:29
Directed at: fankounter at libero dot it
Erm, I think you missed glob() which does what you're doing, only much more efficiently.
see: http://php.net/glob
fankounter at libero dot it
04-Nov-2004 06:31
// ls(dir,pattern) return file list in "dir" folder matching "pattern"
// ls("path","module.php?") search into "path" folder for module.php3, module.php4, ...
// ls("images/","*.jpg") search into "images" folder for JPG images
function ls($__dir="./",$__pattern="*.*")
{
settype($__dir,"string");
settype($__pattern,"string");
$__ls=array();
$__regexp=preg_quote($__pattern,"/");
$__regexp=preg_replace("/[\\x5C][\x2A]/",".*",$__regexp);
$__regexp=preg_replace("/[\\x5C][\x3F]/",".", $__regexp);
if(is_dir($__dir))
if(($__dir_h=@opendir($__dir))!==FALSE)
{
while(($__file=readdir($__dir_h))!==FALSE)
if(preg_match("/^".$__regexp."$/",$__file))
array_push($__ls,$__file);
closedir($__dir_h);
sort($__ls,SORT_STRING);
}
return $__ls;
}
m2pc (at) hotmail.com
07-Oct-2004 09:18
After searching all over the place to find a function to do what I wanted, I wrote the following:
/*
** Returns an array of valid drives on the system (a:, b:, etc.)
*/
function getSystemDrives () {
// Initialize
$aResult = Array ();
// Loop from A-Z and try opening the root dir
for ($letter = 'A'; $letter <= 'Z'; $letter ++) {
if (is_dir ($letter . ":"))
$aResult [] = $letter . ":";
}
// Return results
return ($aResult);
}
It simply returns an array of valid drives as seen from the server (A:, B:, etc.). This obviously is targeted to Win32 installations only.
Storm Reaver
13-Apr-2004 07:48
The way to write files on server where it is not possible (e.g. Gorodok.net)
<?php
function killfile($ftp, $login, $pass, $filename){
$conn_id = ftp_connect($ftp);
$login_result = ftp_login($conn_id, $login, $pass);
if ((!$conn_id) || (!$login_result)) { return false; } else {
$del = ftp_delete($conn_id, $filename);
if (!del) { return false; } else {return true;}
}
ftp_close($conn_id);
}
killfile("gorodok.net", "login", "password", "/path/file.extension");
$fs = fopen("ftp://login:password@gorodok.net/path/file.extension", "w");
fclose($fs);
?>
ken at xzone9 dot com
16-Mar-2004 12:46
The following will work on UNIX (from peeweeks code submitted for "Windows")---
function ls ($curpath) {
$dir = dir($curpath);
echo("<b>$curpath</b>");
echo "<blockquote>";
while ($file = $dir->read()) {
if($file != "." && $file != "..") {
if (is_dir($curpath.$file)) {
ls($curpath.$file."/");
} else {
echo("$file<br>");
}
}
}
$dir->close();
echo "</blockquote>";
return;
}
//Use:
$startpath = "/home/mypath/";
ls($startpath);
http://iubito.free.fr
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
function relativePath($path1, $path2='')
{
if ($path2 == '') {
$path2 = $path1;
$path1 = getcwd();
}
$path1 = trim($path1,'/');
$path2 = trim($path2,'/');
while (substr_count($path1, '//')) $path1 = str_replace('//', '/', $path1);
while (substr_count($path2, '//')) $path2 = str_replace('//', '/', $path2);
$arr1 = explode('/', $path1);
if ($arr1 == array('')) $arr1 = array();
$arr2 = explode('/', $path2);
if ($arr2 == array('')) $arr2 = array();
$size1 = count($arr1);
$size2 = count($arr2);
$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 ! :-)
Gregor Mosheh
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)$/');
Gregor Mosheh
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');
aggarwal_deep at hotmail dot com
16-Jul-2003 02:43
The following souce is the combination of 3 different function ,does the listing of the whole files in directories or sub-directories of a base directory(given). And find out the maximum file size of given application files. for example it will tell the maximum file size of ppt file that is placed in the directory.
<?
function showExtension($file){
if(is_file($file)){
$fileInfo = pathinfo($file);
$extension=$fileInfo["extension"];
} else {
$extension="";
}
return $extension;
}
function fsize($size) {
$a = array("B", "KB", "MB", "GB", "TB", "PB");
$pos = 0;
while ($size >= 1024) {
$size /= 1024;
$pos++;
}
return round($size,2)." ".$a[$pos];
}
function ls ($curpath) {
$dir = dir($curpath);
$file_namearr = array("ETC","PPT","XLS","DOC","PDF");
echo("<b>$curpath</b>");
echo "<blockquote>";
$file_sizearr = array(1,1,1,1,1);
while ($file = $dir->read()) {
if($file != "." && $file != "..") {
if (is_dir($curpath.$file)) {
ls($curpath.$file."/");
}
else {
$filext= strtoupper(showExtension($curpath.$file));
$curr_key = 0;
$curr_key = array_search($filext,$file_namearr);
if($curr_key){
$curr_file_size = $file_sizearr[$curr_key];
if(filesize($curpath.$file)>$curr_file_size){
$file_sizearr[$curr_key]= intval(filesize($curpath.$file));
}
}
}
}
}for($k=0;$k<5;$k++){
echo"<br>".$file_namearr[$k].":".fsize($file_sizearr[$k]);
}
$dir->close();
echo "</blockquote>";
return;
}
$startpath = "/home6/docmng/";
ls($startpath);
?>
l_domenech at yahoo dot ca
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...)
mitra at mitra dot biz
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, ":");
peeweek at altern dot org
09-May-2003 05:06
here is a function that recurses all directories in a Windows Tree then displays for each directory its contents.
function ls ($curpath) {
$dir = dir($curpath);
echo("<b>$curpath</b>");
echo "<blockquote>";
while ($file = $dir->read()) {
if($file != "." && $file != "..") {
if (is_dir($curpath.$file)) {
ls($curpath.$file."\\");
} else {
echo("$file<br>");
}
}
}
$dir->close();
echo "</blockquote>";
return;
}
Use:
$startpath = "D:\\something\\";
ls($startpath);
regis at webstuff dot com dot br
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
jdhurn at uberidx dot com
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);
}
meheler at canada dot com
06-Mar-2002 11:55
Here is a useful function that checks for the existance of a file in PHP's include_path:
// Searches PHP's include_path variable for the existance of a file
// Returns the filename if it's found, otherwise FALSE.
// Only works on a *nix-based filesystem
// Check like: if (($file = file_exists_path('PEAR.php')) !== FALSE)
function file_exists_path($file) {
// Absolute path specified
if (substr($path,0,1)=='/')
return (file_exists($file))?realpath($file):FALSE;
$paths = explode(':',ini_get('include_path'));
foreach ($paths as $path) {
if (substr($path,-1)!='/') $path = "$path/";
if (file_exists("$path$file"))
return realpath("$path$file");
}
return FALSE;
}
Mike
| |