確かにそこにあるのにNo such file or directory

php5.5×windows10

windowsでファイルを作成してローカルに保存してchmodするとき、1つのファイルだけ毎回

PHP Warning:  chmod(): No such file or directory

になって困ってました。

結論から言うと、日本語ファイル名(sjis-win)で、ダメ文字「ソ」が入っているファイルだけ失敗していて、うまい回避方が見つけられなかったのでファイル名を英数字で保存することにしました。

えっこれやばくない??不便過ぎない??
って思ったけどphp7.1で解決してるみたいです。

Windows版 PHP 7.1 で日本語パス(パス文字列のエンコーディング)が対応されることによる影響 - Qiita


以下結論にたどり着くまでのログ

パスが間違ってるのかな?

<?php
var_dump(file_exists("c:/test/マルソフト.txt")); // boolean false

えっパス完全に合ってるのにfalse???
とりあえず、一つ上のディレクトリにfile_exists()してみる

<?php
var_dump(file_exists("c:/test/")); //boolean true

一つ上までは存在する…。
日本語ファイル名がダメなのかな?
ファイル名を英数字だけにリネームして再度実行してみる。

<?php
var_dump(file_exists("c:/test/test.txt")); // boolean true

やっぱり日本語ファイル名か。
なにか見えない文字でも入ってる?入ってるとしたらどこだろう? glob()で1文字ずつ確認してみる。

<?php
var_dump(glob("c:/test/マ*")); // array (size=1)
var_dump(glob("c:/test/マル*")); // array (size=1)
var_dump(glob("c:/test/マルソ*")); // array (size=0) empty
var_dump(glob("c:/test/マル*フ*")); // array (size=1)
var_dump(glob("c:/test/マル*フト*"));  // array (size=1)
var_dump(glob("c:/test/マル*フト.txt"));  // array (size=1)

「ソ」が犯人です!!!

Shift_JISのダメ文字 - fudist

ggった結果「ソ」はダメ文字と呼ばれる文字の1つで、そういわれる理由があるそうです………