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");
}
}
}
?>
Dosya Sistemi İşlevleri
Ayrıca Bakınız
Dosya sistemi ile ilgili diğer işlevler için Dizinler ve Program Çalıştırma bölümlerine bakınız.
Uzak dosyalar için kullanılabilen çeşitli URL sarmalayıcıları hakkında bilgi edinmek için Supported Protocols and Wrappers bölümüne bakınız.
İçindekiler
- basename — Dosya yolunun dosya ismi bileşenini döndürür
- chgrp — Dosya grubunu değiştirir
- chmod — Dosya kipini değiştirir
- chown — Dosyanın sahibini değiştirir
- clearstatcache — Dosya durum önbelleğini temizler
- copy — Dosya kopyalar
- delete — unlink veya unset işlevine bakınız
- dirname — Belirtilen dosya yolunun dizin bileşenini döndürür
- disk_free_space — Dizindeki kullanılabilir bayt sayısını döndürür
- disk_total_space — Bir dizinin toplam boyunu döndürür
- diskfreespace — disk_free_space işlevinin takma adıdır
- fclose — Açık bir dosya tanıtıcısını kapatır
- feof — Bir dosya tanıtıcısı üzerinde konum dosya sonunda mı diye bakar
- fflush — Çıktıyı bir dosyaya boşaltır
- fgetc — Dosya tanıtıcısından bir karakter döndürür
- fgetcsv — Dosya tanıtıcısından CSV alanlarını çözümleyerek bir satır döndürür
- fgets — Dosya tanıtıcısından bir satır döndürür
- fgetss — Dosya tanıtıcısından bir satırı HTML etiketlerinden arındırarak döndürür
- file_exists — Bir dosya veya dizinin mevcut olup olmadığına bakar
- file_get_contents — Dosya içeriğinin tamamını bir dizge olarak döndürür
- file_put_contents — Bir dizgeyi bir dosyaya yazar
- file — Dosya içeriğinin tamamını bir diziye okur
- fileatime — Dosyaya son erişim zamanını döndürür
- filectime — Dosyanın dosya düğümü değişiklik zamanını döndürür
- filegroup — Dosyanın sahibi olan grubu döndürür
- fileinode — Dosyanın düğüm numarasını döndürür
- filemtime — Dosyanın değişiklik zamanını döndürür
- fileowner — Dosya sahibini döndürür
- fileperms — Dosya izinlerini döndürür
- filesize — Dosya uzunluğunu döndürür
- filetype — Dosya türünü döndürür
- flock — Taşınabilir tavsiye niteliğinde dosya kilitleme
- fnmatch — Dosya ismi belirtilen kalıpla eşleşiyor mu diye bakar
- fopen — Bir dosya veya URL'yi açar
- fpassthru — Bir dosya tanıtıcısında kalan verinin tamamını çıktılar
- fputcsv — Satırı CSV olarak biçemler ve dosya tanıtıcısına yazar
- fputs — fwrite işlevinin takma adıdır
- fread — Dosyayı ikil kipte okur
- fscanf — Bir dosyadaki girdiyi belli bir biçeme göre çözümler
- fseek — Dosya tanıtıcısında konumu bir yerden başka bir yere taşır
- fstat — Bir açık dosya tanıtıcısı kullanarak bir dosya hakkında bilgi döndürür
- ftell — Dosya okuma/yazma konumlayıcının mevcut konumu ile döner
- ftruncate — Bir dosyayı belli bir uzunlukta budar
- fwrite — Dosyaya ikil kipte yazar
- glob — Bir kalıpla eşleşen dosya yollarını bulur
- is_dir — Bir dosyanın bir dizin olup olmadığını söyler
- is_executable — Bir dosyanın çalıştırılabilir bir dosya olup olmadığını söyler
- is_file — Bir dosyanın sıradan bir dosya olup olmadığını söyler
- is_link — Bir dosyanın sembolik bağ olup olmadığını söyler
- is_readable — Bir dosyanın mevcut ve okunabilir olup olmadığını söyler
- is_uploaded_file — Bir dosya HTTP POST üzerinden karşıya yüklenebilecekse bunu söyler
- is_writable — Bir dosyanın yazılabilir olup olmadığını söyler
- is_writeable — is_writable işlevinin takma adıdır
- lchgrp — Bir sembolik bağın grubunu değiştirir
- lchown — Bir sembolik bağın sahibini değiştirir
- link — Sabit bir bağ oluşturur
- linkinfo — Bir bağ hakkında bilgi verir
- lstat — Bir dosya veya sembolik bağ hakkında bilgi verir
- mkdir — Dizin oluşturur
- move_uploaded_file — Karşıya yüklenen bir dosyayı yeni bir yere taşır
- parse_ini_file — Bir yapılandırma dosyasını çözümler
- parse_ini_string — Bir yapılandırma dizgesini çözümler
- pathinfo — Bir dosya yolu hakkında bilgi döndürür
- pclose — Bir süreç tanıtıcısını kapatır
- popen — Bir süreç tanıtıcısı açar
- readfile — Bir dosyayı çıktılar
- readlink — Bir sembolik bağın hedefi ile döner
- realpath_cache_get — Get realpath cache entries
- realpath_cache_size — Get realpath cache size
- realpath — Normalleştirilmiş mutlak dosya yolunu döndürür
- rename — Bir dosya veya dizinin ismini değiştirir
- rewind — Bir dosya tanıtıcısında konumu başa taşır
- rmdir — Dizin siler
- set_file_buffer — stream_set_write_buffer işlevinin takma adıdır
- stat — Bir dosya hakkında bilgi döndürür
- symlink — Bir sembolik bağ oluşturur
- tempnam — Eşsiz bir isimle dosya oluşturur
- tmpfile — Geçici bir dosya oluşturur
- touch — Dosyanın erişim ve değişiklik zamanını ayarlar
- umask — Geçerli izin maskesini değiştirir
- unlink — Bir dosyayı siler
tunnelareaten at gmail dot com ¶
8 years ago
Christian ¶
6 years ago
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.
Gregor Mosheh ¶
9 years ago
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)$/');
l_domenech at yahoo dot ca ¶
9 years ago
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...)
regis at webstuff dot com dot br ¶
10 years ago
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
drapeko.com ¶
3 years ago
You have an array of directories (straightforward list of directories):
<?php
$array = array(
'/home/drapeko/var',
'/home/drapeko/var/y',
'/home/drapeko',
'/home',
'/var/libexec'
);
);
?>
And you would like to transform this array to hierarchy of directories:
<?php
$array = array (
'home' => array (
'drapeko' => array (
'var' => array (
'y' => array()
)
)
),
'var' => array(
'libexec' => array()
)
);
?>
How can you do it?
First of all the below function will help us.
<?php
/**
* This function converts real filesystem path to the string array representation.
*
* for example,
* '/home/drapeko/var/y will be converted to $result_array['home']['drapeko']['var']['y']
* '/home/drapeko/var/y/file.txt will be converted to $result_array['home']['drapeko']['var']['y']
*
* @param $path realpath of the directory
* @return string string array representation of the path
*/
function pathToArrayStr($path) {
// TODO constants/configs?
$res_path = str_replace(array(':/', ':\\', '/', '\\', DIRECTORY_SEPARATOR), '/', $path);
// if the first or last symbol is '/' delete it (e.g. for linux)
$res_path = preg_replace(array("/^\//", "/\/$/"), '', $res_path);
// create string
$res_path = '[\''.str_replace('/', '\'][\'', $res_path).'\']';
return $res_path;
}
?>
It simply converts the real path of the file to array string representation.
How can you use this function? I know it looks like a little confusing. But it's quite simple. Consider the example below:
<?php
$result = array();
$check = array();
foreach($array as $val) {
$str = pathToArrayStr($val, 'result');
foreach($check as $ck) {
if (strpos($ck, $str) !== false) {
continue 2;
}
}
$check[] = $str;
eval('$result'.$str.' = array();');
}
print_r($result);
?>
Heh, how do you find it? This approach has helped me very much. I hope you will find it useful. :)
ob at babcom dot biz ¶
2 months ago
a function based on "tunnelareaten at gmail dot com"s idea to search for files in a given directory by a searchstring or by fileextension.
I added support to search recursively through all sub-directories an to determine weather the filepath should be returned or not.
<?php
// recursive function to get contents of given folder by searchterm or fileextension
// (does not show folders)
// standards: Foldername: string
// Searchterm: string
// Searchtype: ext/search (file-extension or searchterm within filename)
// SaveCompletePath: true/1
// usage: array FileSearch_r($Folder,$Search[,$SearchType,$SavePath])
function FileSearch_r($Dir,$Search,$SearchType="search",$SavePath=1) {
$Array=array();
$D=dir($Dir);
while (false!==($Entry=$D->read()))
if ($Entry!='.' && $Entry!='..') {
$Entry=$Dir.$Entry;
if (is_dir($Entry)) $Array=array_merge($Array,FileSearch_r($Entry.'/',$Search,$SearchType,$SavePath));
else
if ($SearchType=="search"
?substr_count($Entry,$Search)>0
:($SearchType=="ext"
?substr($Entry,-strlen($Search))===$Search
:true))
$Array[]=$Entry;
}
$D->close();
sort($Array,SORT_STRING);
if(!(bool)$SavePath) $Array=str_replace($Dir,"",array_values($Array));
return $Array;
}
?>
mitra at mitra dot biz ¶
10 years ago
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, ":");
jdhurn at uberidx dot com ¶
10 years ago
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);
}
Gregor Mosheh ¶
9 years ago
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');
http://iubito.free.fr ¶
9 years ago
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 ! :-)
