PHPのファイル操作
PHPでファイルを扱う方法として、ファイルを開いて読み書きを行う方法と、ファイルを開かずに読み書きを行う方法の2通りが存在する。
| モード | 読み/書き | ファイルポインタ | ファイルが存在しない時 |
|---|---|---|---|
| r | 読み | 先頭 | エラー |
| r+ | 読み/書き | 先頭 | エラー |
| w | 書き | 先頭(上書き) | 新規作成 |
| w+ | 書き/読み | 先頭(上書き) | 新規作成 |
| a | 書き | 終端(追記) | 新規作成 |
| a+ | 書き/読み | 終端(追記) | 新規作成 |
| x | 書き | 先頭 | 新規作成(既存の場合エラー) |
| x+ | 書き/読み | 先頭 | 新規作成(既存の場合エラー) |
| 設定値 | 内容 |
|---|---|
| LOCK_SH(1) | 共有ロック |
| LOCK_EX(2) | 排他的ロック |
| LOCK_UN(3) | ロックを解除 |
| LOCK_NB(4) | ロック中にflock()でブロックさせない |
ファイルを開いて読み書きを行う方法
ファイルの読み込みは、fopen()でファイルを開いて、flock()でファイルをロックし、fgets()(またはfgetc()、fread())でファイルのデータを読み取り、flock()でロックを解除し、fclose()でファイルを閉じる。
<?php
//ファイルの読み込み
$aaa="test.txt"; //ファイル名
$bbb=fopen($aaa,"a+")or die("era-"); //ファイルを書き/読み追記モードで開く
flock($bbb,LOCK_SH); //共有ロック
while(!feof($bbb)){ //feof()はファイルポインタが終端に達しているかどうかを調べ、終端ならtrue
$ccc=fgets($bbb,100); //開いたファイルを1行(1000バイトまで)読み込む
echo($ccc);
}
flock($bbb,LOCK_UN); //ロックの解放
fclose($bbb); //ファイルを閉じる
?>
whileとfeof()関数で終端を調べて読み込みを繰り返す作業を入れないと、1行だけしか読み取ることができない。全行読み取るためにはこうする。
ファイルの書き込みは、fopen()でファイルを開いて、flock()でファイルをロックし、fputs()でファイルに書き込み、flock()でロックを解除し、fclose()でファイルを閉じるという一連の流れを経る方法。
<?php
//ファイルの書き込み
$aaa="test.txt"; //ファイル名
$bbb=fopen($aaa,"w+")or die("era-"); //ファイルを書き/読み上書きモードで開く
flock($bbb,LOCK_EX); //排他的ロック
fputs($bbb,"はじめまして\n"); //データの書き込み。複数行のファイルも上書きされ1行になる
flock($bbb,LOCK_UN); //ロックの解放
fclose($bbb); //ファイルを閉じる
?>
ファイルを開かず読み書きを行う方法
ファイルの読み込みはfile()関数を使用する。ファイルを開く方法よりこちらのほうが一般的。
<?php
//ファイルの読み込み
$aaa=file("test.txt");//text.txtのデータを1行ずつ配列に入れる。$aaa[0]が1行目。
for($i=0;$i<count($aaa);$i++){//countで$aaa配列の要素数を調べる
$no=$i+1;
echo("記事No".$no.":".$aaa[$i]."<br /><hr />");
}
?>
ファイルの書き込みはfile_put_contents()関数を用いる。3番目の引数(FILE_APPEND)をつけると追記、省略すると上書きモードになる。
<?php //ファイルの書き込み $aaa="test.txt"; //ファイル名 file_put_contents($aaa,"はじめまして\n",FILE_APPEND); //ファイルに追記モードで書き込み ?>
ファイルのアップロード
フォームのenctypeをmultipart/form-data、typeをfileとしてsubmitすることでファイルのアップロードが可能、nameをキーとしてそのファイルを扱うことができる。
アップロードされたテンポラリファイルは処理が終了されると削除されるため、すぐ本元のファイルにコピーしておく。
| 項目 | 説明 |
|---|---|
| $_FILE[ パラメータ名 ][ name ] | アップロードファイル名 |
| $_FILE[ パラメータ名 ][ type ] | MIMEタイプ |
| $_FILE[ パラメータ名 ][ size ] | アップロードされたファイルサイズ |
| $_FILE[ パラメータ名 ][ tmp_name ] | テンポラリファイル名。アップロードされたファイルが一時的に保存されたファイルパス |
| $_FILE[ パラメータ名 ][ error ] | エラーコード。正常にアップロードされたらゼロになります。 |
パラメータ名は、nameの中身。
アップロードされたファイルは、テンポラリファイルとして$_FILE[ パラメータ名 ][ tmp_name ]に、一時的に格納されますが、PHPスクリプト終了と同時に削除されます。その為、テンポラリファイルを@move_uploaded_file()関数を使用して正式な格納場所にコピーする必要があります。(引用元:こちら)
<?php
$save_dir="./file/img/"; //ファイルを保存するディレクトリ
$file_name=$save_dir.$_FILES["upfile"]["name"]; //ファイル名(ディレクトリを含める)
if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { //is_uploaded_fileでファイルがアップロードされたかどうかを調べる
copy($_FILES["upfile"]["tmp_name"],$file_name); //テンポラリファイルをファイルにコピーする
//move_uploaded_file($filetmp,$file_name); //テンポラリファイルを移動する
echo("upおk!! ファイル名:".$_FILES["upfile"]["name"]);
}
?>
ファイルが上手くアップロードされない場合は、php.iniの設定をいじる必要がある。
| 項目 | 説明 |
|---|---|
| file_uploads | ファイルのアップロードを許可するかどうか |
| upload_tmp_dir | アップロードファイル用テンポラリディレクトリ |
| upload_max_size upload_max_filesize |
アップロードファイルの最大サイズ |
<?php
$aaa="test.txt";
$bbb=date("Y/m/d H:i:s",fileatime($aaa)); //fileatime(ファイル名)でファイルの最終アクセス時刻をタイムスタンプで返す。
print_r($bbb); //2014/06/22 13:57:58
$bbb=date("Y/m/d H:i:s",filemtime($aaa)); //filemtime(ファイル名)でファイルの最終更新時刻をタイムスタンプで返す。
print_r($bbb); //2014/06/22 15:25:31
$bbb=filesize($aaa); //ファイルのサイズ(バイト)
print_r($bbb); //38
$bbb=pathinfo($aaa); //ファイルのパス情報を取得
$ccc=$bbb["extension"]; //ファイルの拡張子を取得。extensionをbasenameにするとファイル名を取得できる。
print_r($ccc); //txt
if(file_exists($aaa){ //ファイルが存在するかどうかを調べる
echo("ファイルが存在します。");
}
if(file_readable($aaa){ //ファイルが読み取り可能かどうかを調べる
echo("ファイルは読み取り可能です。");
}
if(file_executable($aaa){ //ファイルが実行可能かどうかを調べる。
echo("ファイルは実行可能です。");
}
if(is_uploaded_file($aaa){ //ファイルがアップロードされたかを調べる。
echo("ファイルはアップロードされています。");
}
$bbb=$copy($aaa,"test1.txt"); //$aaa(test.txt)の内容をtest1.txtに上書きコピーする。
?>
JavaScriptのファイル操作
作成中につきしばしお待ちを。
コメントor補足情報orご指摘あればをお願いします。
- << 前のページ
- 次のページ >>
