Help us understand the problem. What is going on with this article?

【PHP】ファイル入出力、dirnameとbasename結合時の注意点|'/'を忘れずに!

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結合時の注意点です。

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'

なんてことないですね!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした