【CakePHP】Folder & File APIでディレクトリやファイルを操作する。
fukasawaです。こんにちは。
先日、風呂掃除の最中に身体を捻ってしまい、背骨を\コキャッ/とやってしまったのですが、救急車を呼んでいいかどうかの判断がつかずとても困りました。結局、ただのぎっくり背中だったので翌日病院に行った後寝込んで治したのですが、突然動けなくなるとどうしたらよいかわからなくなりますね。
さて、CakePHPにはFolder API、File APIというものがあります。ディレクトリやファイルを操作する為のユーティリティなのですが、ディレクトリ・ファイルの生成・削除・コピー等の操作を行ったり、ファイル名の一覧やファイルの情報を取得したりといった機能が用意されています。使ったことが無かったのですが、気になったので簡単に使い方について調べてみました。
※Folder & File APIはバージョン2.x以降の機能になります。
準備
App::uses()を使用してFolderクラスとFileクラスをロードし、それぞれのAPIを使用できるようにしておきます。ディレクトリ・ファイル操作を行いたいコントローラやモデルに以下の記述を追記します。
App::uses('Folder', 'Utility');
App::uses('File', 'Utility');
ディレクトリ操作
Folder APIを使用してディレクトリの操作を行います。
ディレクトリ・ファイルの一覧表示する。
Folder::read()を使用します。
$dir = new Folder(WWW_ROOT.'path/');
debug($dir->read());
/*
出力内容:
array(
(int) 0 => array(
(int) 0 => 'test_dir'
),
(int) 1 => array(
(int) 0 => 'test.txt',
(int) 1 => 'test2.txt'
)
)
*/
webroot配下のpathディレクトリに含まれる、ディレクトリ・ファイルの一覧を配列で取得します。
Folderインスタンスの生成について
- インスタンス化する際に、ディレクトリのパスを指定します。(デフォルトはapp\tmp)
- 第2引数にtrueを指定すると、ディレクトリが存在しない場合は新規作成します(デフォルトはfalse)。
- 第3引数にはディレクトリのパーミッションを指定できます。(デフォルトは0755)
$dir = new Folder(WWW_ROOT.'path/',true,0755);
新規ディレクトリを作成
Folder::create()を使用します。
$dir = new Folder();
if ($dir->create(WWW_ROOT.'path/')) {
return true;
}
webrootの下にpathディレクトリが新規作成されます。
ディレクトリを削除
Folder::delete()を使用します。
$folder = new Folder(WWW_ROOT.'path/');
if ($folder->delete()) {
return true;
}
webrootの下のpathディレクトリが削除されます。
ディレクトリをコピー
Folder::copy()を使用します。
$dir = new Folder(WWW_ROOT.'path/');
if ($dir->copy(WWW_ROOT.'path2/')){
return true;
}
pathディレクトリをpath2ディレクトリにコピーします。ディレクトリの中身も再帰的にまるっとコピーします。
下記のように配列でオプションを指定することもできます。
$dir = new Folder(WWW_ROOT.'path/');
$dir->copy(array(
'to' => WWW_ROOT.'path2/',
'from' => WWW_ROOT.'path/',
'mode' => 0755, //パーミッション
'skip' => array('.git', '.svn') //無視するファイル
));
ディレクトリを移動
Folder::move()を使用します。
$dir = new Folder(WWW_ROOT.'path/');
if ($dir->move(WWW_ROOT.'path2/')){
return true;
}
pathディレクトリをpath2ディレクトリに再帰的に移動します。Folder::copy()と同様、配列でオプションを指定するも可能です。
ディレクトリ内のファイルを検索
Folder::find()を使用します。
$dir = new Folder(WWW_ROOT.'path/');
$files = $dir->find('.*\.txt', true);
debug($files);
/*
出力内容:
array(
(int) 0 => 'test.txt',
(int) 1 => 'test2.txt'
)
*/
pathディレクトリから拡張子「.txt」のファイルを検索し、配列で返します。
- ファイルのみを検索します
- 第二引数にtrueを指定すると検索結果をソートして返します
ファイル操作
File APIを使用してファイルの操作を行ってみます。
ファイルの情報を取得する。
File::info()を使用します。
$file = new File(WWW_ROOT.'path/test.txt');
debug($file->info());
/*
出力内容:
array(
'dirname' => 'C:\xampp\htdocs\cake_test\app\webroot\path',
'basename' => 'test.txt',
'extension' => 'txt',
'filename' => 'test',
'filesize' => (int) 94,
'mime' => false
)
*/
ファイルの内容を取得する。
File::read()を使用します。
$file = new File(WWW_ROOT.'path/test.txt');
debug($file->read());
$file->close();
/*
' ファイルの中身です。
ファイルの中身です。
ファイルの中身です。'
*/
WWW_ROOT/path/test.txtの内容を文字列で取得し出力しています。(失敗した場合はfalseが返されます。) 終わったらFile::close()でオープンされたファイルをクローズしておきます。
ファイルに書き込む。
File::write()を使用します。
$file = new File(WWW_ROOT.'path/test_write.txt',true);
$file->write('この文字列がファイルに書き込まれます。');
$file->close();
指定の文字列がtest_write.txtに書き込まれます(上書き)。 ファイルの末尾に追記したい場合は第二引数に'a'を指定するか、File::append()を使用します。
$file = new File(WWW_ROOT.'path/test_write.txt',true);
$file->write("この文字列が追記されます。\n",'a');
$file->append("この文字列が追記されます。\n");
$file->close();
ファイルを新規作成する。
File::create()を使用します。
$file = new File(WWW_ROOT.'path/test_create.txt');
$file->create();
test_create.txtが作成されます。
また、File::create()を使用しなくても、Fileインスタンスを作成するときの第二引数にtrueを指定してあげると、存在しないファイルだった場合に新規作成してくれます。
$file = new File(WWW_ROOT.'path/test_create.txt',true);
ファイルを削除する。
File::delete()を使用します。
$file = new File(WWW_ROOT.'path/test_delete.txt');
$file->delete();
test_delete.txtが削除されます。
ファイルをコピーする。
File::copy()を使用します。
$file = new File(WWW_ROOT.'path/test_copy.txt');
$file->copy(WWW_ROOT.'path/test_copy_dest.txt',true);
test_copy.txtをtest_copy_dest.txtにコピーします。 第二引数にtrueを指定すると、コピー先が存在した場合に上書きされます。