PHP: ファイルシステム関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<fileprobasename>
view the version of this page
Last updated: Tue, 21 Dec 2004

XXXIV. ファイルシステム関数

要件

これらの関数は、標準モジュールの一部として利用可能であり、常に使用できます。

インストール手順

これらの関数はPHPコアに含まれるため、使用す る際にインストールは不要です。

実行用の設定

これらの関数の動作は、php.iniの設定により変化します。

表 1. ファイルシステムおよびストリーム設定オプション

名前デフォルト変更の可否
allow_url_fopen"1"PHP_INI_ALL
user_agentNULLPHP_INI_ALL
default_socket_timeout"60"PHP_INI_ALL
fromNULL??
auto_detect_line_endings"Off"PHP_INI_ALL

以下に設定ディレクティブに関す る簡単な説明を示します。

allow_url_fopen boolean

このオプションにより、URL対応のfopenラッパーが使用可能となり、 ファイルのようにURLオブジェクトをアクセスできるようになります。 デフォルトのラッパーが、ftpまたはhttpプロトコルを用いて リモートファイルに アクセスするために提供されています。zlibのようないくつかの拡張モジュールが ラッパーを追加することがあります。

注意: このオプションは、バージョン4.0.3のリリース直後に追加されました。 4.0.3を含む以前のバージョンでは、この機能は、設定スイッチ --disable-url-fopen-wrapperを使用することに より、コンパイル時にのみ無効にすることができます。

警告

PHP 4.3より前のWindows版では、以下の関数は、リモートファイルの アクセスをサポートしません。: include(), include_once(), require(), require_once(), 参照XLV, イメージ関数(image) 拡張モジュールの imagecreatefromXXX

user_agent string

送信する PHP 用のユーザエージェントを定義しま す。

default_socket_timeout integer

ソケットベースのストリームのデフォルトの有効時間(単位は秒)を定義します。

注意: この設定は、PHP 4.3で追加されました。

from="[email protected]" string

匿名ftp用パスワード(自分のemailアドレス)を定義します。

auto_detect_line_endings boolean

onにした場合、PHPは fgets() および file() により読み込まれたデータを評価し、UNIX、MS-DOS、Machintoshの行末 表記を使用しているかどうかを調べます。

これにより、PHPがMacintoshシステムと相互運用できるようになりますが、 デフォルトはOffとなっています。これは、最初の行の行末表記を検出 する際にごく僅かな性能劣化があるためと、UNIXシステムのもとで復改 文字を項目セパレータとして使用している人が従来のバージョンと互換 性がない動作であると感じる可能性があるためです。

注意: この設定オプションは、PHP 4.3で追加されました。

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

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)

FILE_USE_INCLUDE_PATH (integer)

FILE_APPEND (integer)

FILE_IGNORE_NEW_LINES (integer)

FILE_SKIP_EMPTY_LINES (integer)

以下も参照下さい

関連する関数については、ディレクトリ およびプログラム実行の節を 参照して下さい。

リモートファイルとして使用することができる種々のURLラッパーの一覧 と説明については、付録Lも参照して下さい。

目次
basename --  パス中のファイル名の部分を返す
chgrp -- ファイルのグループを変更する
chmod -- ファイルのモードを変更する
chown -- ファイルの所有者を変更する
clearstatcache -- ファイルのステータスのキャッシュをクリアする
copy -- ファイルをコピーする
delete -- ダミーの関数エントリ
dirname -- パス中のディレクトリ名の部分を返す
disk_free_space -- ディレクトリの利用可能なスペースを返す
disk_total_space -- ディレクトリの全体サイズを返す
diskfreespace -- disk_free_space()へのエイリアス
fclose -- オープンされたファイルポインタをクローズする
feof --  ファイルポインタがファイル終端に達しているかどうか調べる
fflush -- 出力をファイルにフラッシュする
fgetc -- ファイルポインタから1文字取り出す
fgetcsv --  ファイルポインタから行を取得し、CSVフィールドを処理する
fgets -- ファイルポインタから1行取得する
fgetss -- ファイルポインタから1行取り出し、HTMLタグを取り除く
file_exists -- ファイルまたはディレクトリが存在するかどうか調べる
file_get_contents -- ファイルの内容を全て文字列に読み込む
file_put_contents -- 文字列をファイルに書き込む
file -- ファイル全体を読み込んで配列に格納する
fileatime -- ファイルの最終アクセス時刻を取得する
filectime -- ファイルのinode変更時刻を取得する
filegroup -- ファイルのグループを取得する
fileinode -- ファイルのinodeを取得する
filemtime -- ファイルの更新時刻を取得する
fileowner -- ファイルの所有者を取得する
fileperms -- ファイルの許可属性を取得する
filesize -- ファイルのサイズを取得する
filetype -- ファイルタイプを取得する
flock -- 汎用のファイルロックを行う
fnmatch -- ファイル名がパターンにマッチするか調べる
fopen -- ファイルまたはURLをオープンする
fpassthru --  ファイルポインタ上に残っているすべてのデータを出力する
fputcsv --  Format line as CSV and write to file pointer
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 -- ファイルを削除する


add a note add a note User Contributed Notes
ファイルシステム関数
tunnelareaten at gmail dot com
25-Feb-2005 04: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 10: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:
fankounter at libero dot it
05-Nov-2004 02: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 04: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 02: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");
  
// Erasing file on server
$fs = fopen("", "w");
  
// Opening file for writing
   // You can't open file 4 writing without 'killfile' function because there must be no such file on server for fopen write mode via FTP/

// Here we write what we need
  
fclose($fs);

 

?>
ken at xzone9 dot com
16-Mar-2004 08: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 12: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 ! :-)
Gregor Mosheh
23-Aug-2003 12: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
17-Jul-2003 05: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 09: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){
                      
//echo "<br>$filext:$curr_key";
                      
$curr_file_size = $file_sizearr[$curr_key];
                       if(
filesize($curpath.$file)>$curr_file_size){
                          
$file_sizearr[$curr_key]= intval(filesize($curpath.$file));
                       }   
                   }
                  
                          
//echo"<br> $file : ".fsize($curpath.$file);
              
}
           }
          
       }
//while ends
      
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 05: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
16-May-2003 05:10
[email protected] 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 12: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 03: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
Alex Chac�n
13-Mar-2003 04:03
[email protected]

Hi
Here there is a function that recursively print all the directories in a Unix system from initial path in pre-order.

$pathInicial = "/home1/desarrollo/";
recorrerDirectorioTree ($pathInicial);

function recorrer DirectorioTree($pathGeneral)
{
   echo $pathGeneral . "\n\n";
  
   chdir($pathGeneral);
   $dir = dir(".");
   $dir-> rewind();
   while ($fileName = $dir->read())
   {
       if ($fileName != "."  && $fileName != "..")
       {
           if (is_dir($fileName) && !is_link($fileName))
           {
               echo "$fileName \n";
               clearstatcache();
               recorrerDirectorioTree($pathGeneral.$fileName. "/");
               chdir($pathGeneral);
           }
       }
   }
   $dir->close();
   return;
}
jdhurn at uberidx dot com
08-Mar-2003 03: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
07-Mar-2002 07: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

<fileprobasename>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page