PHP Unconference Europe 2015

ファイルシステム 関数

参考

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

リモートファイルとして使用することができる種々のURLラッパーの一覧 と説明については、サポートするプロトコル/ラッパーも参照してください。

目次

  • basename — パスの最後にある名前の部分を返す
  • chgrp — ファイルのグループを変更する
  • chmod — ファイルのモードを変更する
  • chown — ファイルの所有者を変更する
  • clearstatcache — ファイルのステータスのキャッシュをクリアする
  • copy — ファイルをコピーする
  • delete — unlink か unset を参照してください
  • 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 — 行を 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 のエイリアス
  • lchgrp — シンボリックリンクのグループ所有権を変更する
  • lchown — シンボリックリンクの所有者を変更する
  • link — ハードリンクを作成する
  • linkinfo — リンクに関する情報を取得する
  • lstat — ファイルあるいはシンボリックリンクの情報を取得する
  • mkdir — ディレクトリを作る
  • move_uploaded_file — アップロードされたファイルを新しい位置に移動する
  • parse_ini_file — 設定ファイルをパースする
  • parse_ini_string — 設定文字列をパースする
  • pathinfo — ファイルパスに関する情報を返す
  • pclose — プロセスのファイルポインタをクローズする
  • popen — プロセスへのファイルポインタをオープンする
  • readfile — ファイルを出力する
  • readlink — シンボリックリンク先を返す
  • realpath_cache_get — realpath キャッシュ・エントリーを取得
  • realpath_cache_size — realpath キャッシュサイズを取得
  • 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 8 notes

up
15
Christian
7 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.
up
3
tunnelareaten at gmail dot com
9 years ago
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");
  }
}
}

?>
up
1
Gregor Mosheh
11 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)$/');
up
1
regis at webstuff dot com dot br
11 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
up
0
drapeko.com
5 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. :)
up
0
mitra at mitra dot biz
11 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, ":");
up
0
jdhurn at uberidx dot com
11 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);
}
up
-2
ob at babcom dot biz
1 year 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;
}
?>
To Top