web系エンジニアを目指し、MENTAを利用し、PHPを学習している初学者です。
日々学習していることの忘備録、モチベ維持、ちゃんとやってることの証明!で、投稿していきます。
(今回の内容もなんてことないのですが、一瞬「??」となったので、メモ)
#対象者
PHPを学びはじめた、初学者
#内容
ファイル入出力設定時便利な、dirnameとbasename結合時の注意点
#動作環境
PHP 7.1.32
##基本のおさらい
###ファイル入出力とは
プログラムに書いた通り、
・ファイルを読み込んだり
・ファイルに書き込んだり
・ディレクトリを作成したり
することが出来ます。
GUIでしかパソコンを触ってこなかった私からすると、ちょっと感動!
//対象のファイル
$filepath = './a/b/c/hoge.csv';
//ファイルを読み込む
1、開いて
$hondle_read = fopen($filepath, 'r');
2、読み込んで
while($read[] = fgets($handle_read))
3、閉じる
fclose($handle);
//ファイルへ書き込む
1、開いて
$handle_write = fopen($filepath, 'w');
2、書き込んで
$write = 'ファイルに書き込む内容';
fwrite($handle_write, $write);
3、閉じる
fclose($handle_write);
####このコードは問題有り
一定の条件
$filepath
のディレクトリ+ファイルが実在していれば、読み込み
$filepath
のディレクトリがあれば、書き込み
が実現しますが、本来は
・ディレクトリがあるか検証
・ファイルがあるか検証
・ファイル内の改行を意識
などが必要です。
公式リファレンスがわかりやすいので、基礎を学びたい方はご参照ください。
PHPマニュアル fgets
#これが本題!
メンターさんからの課題を解く中、
$filepathからディレクトリ部分・ファイル部分を抜き出す関数
dirname,basename
を教えてもらい、早速使ってみるも思い通りに動かない!
今回書きたいのは、
dirnameとbasename結合時の注意点です。
//対象のファイル
$filepath = './a/b/c/hoge.csv';
//dirname
$directory = dirname($filepath);
echo $directory; // ./a/b/c
//basename
$filename = basename($filepath);
echo $filename; // hoge.csv
このように、きれいに**$filepathからディレクトリ部分・ファイル部分を抜き出してくれる**んです!素晴らしい。
でもよくみて下さい。
ディレクトリ「c」と、ファイル「hoge.csv」の間にあった「/」がなくなってる!
なので、これらを結合する時は十分に気を付けて下さいね。
「・・・だから?」
「どう気を付ければ?」
「どんな場面で、その必要が出てくるの?」
そんな初学者の方向けに、実例を出して終了します。
#実例
「連番のファイル名にして出力せよ!」というような課題で、意気揚々とdirname,basename
を使用するも、変なファイル名になってしまう・・
上記の続き
//作成したいファイル
'./a/b/c/hoge_1.csv'
'./a/b/c/hoge_2.csv'
'./a/b/c/hoge_3.csv'
失敗例
//ファイル名にfor文で番号を付加して、ディレクトリと結合すれば、新しいファイルパスの完成だ!
for($i = 1; $i <=3; $i++) {
$filepath[$i] = $directory . $filename . '_' . $i;
}
//$filepath[1]〜[3]を使ってファイル書き出し。出来上がったのは・・
'./a/b/choge_1.csv'
'./a/b/choge_2.csv'
'./a/b/choge_3.csv'
解決策
for($i = 1; $i <=3; $i++) {
$filepath[$i] = $directory . '/' .$filename . '_' .$i;
}
//$filepath[1]〜[3]を使ってファイル書き出し
'./a/b/c/hoge_1.csv'
'./a/b/c/hoge_2.csv'
'./a/b/c/hoge_3.csv'
なんてことないですね!