[PHP][file_exists] Проблема - постоянно возвращает, что файл не существует
Не могу понять, что за херня твориться - файл реально существует и обращаюсь к нему по реальному пути, и нет ни русских букв, ни линков но факт остается:
Например
http://shs.dp.ua/loads/proekty_do_1915_goda/konyushni/konyushnya_1900_god/fasad.jpg
открывается нормально (в браузере - но мне надо полный путь), а:
/var/.../loads/proekty_do_1915_goda/konyushni/konyushnya_1900_god/fasad.jpg
выбивает ошибку - file_exists и, в частности, copy. Собственно задача - проверить есть ли файл и скопировать его куда надо.
Хотя, например opendir - все прекрасно читает. WF?
Я понимаю что проблема не в функции - но не могу понять в чем
realpath все слэши должен привести в нормальное положение, или обратные слэши заэкранируй обратным слэшем. Скорее всего они есть.
Сам недавно натр....ся с этой бедой. Причём в разных сборках работает по-разному. Такое ощущение, что в PHP5.3 кто-то перекрыл чем-то эти функции.
realpath все слэши должен привести в нормальное положение, или обратные слэши заэкранируй обратным слэшем. Скорее всего они есть.
Сам недавно натр....ся с этой бедой. Причём в разных сборках работает по-разному. Такое ощущение, что в PHP5.3 кто-то перекрыл чем-то эти функции.
ок. поробую.
Но все равно фигня какая то - запустил через опендир - отработало как надо. Идиотизм.
© ТУТ
Что это означает, я смутно понимаю, но может у тебя как-то с этим связано?
если открывать директорию - все отрабатывает.
Если же читать имя из файла (как собственно мне надо) - не отрабатывает. Гдето, что-то ему мешает.
© ТУТ
Что это означает, я смутно понимаю, но может у тебя как-то с этим связано?
да вроде как нет. ладно буду потом еще разбираться
А opendir - читает с файловой системы. Хотя и там и там UTF-8
Имена файлов однозначно в восьмибитной кодировке. Разве нет?
Имена файлов однозначно в восьмибитной кодировке. Разве нет?
как бы не совсем так должно быть :)
имена файлов как раз таки в юникоде (по крайней мере рузкие), иначе с чего в терминальной сессии на сервере, если не настроен юникод для терминала - то есть проблемы с отображением.
Поэтому, я всю фигню, которую дал клиент прогнал специальной утилитой, перекодировав все в транслит (в смысле имена файлов и директорий). Эта же утилита формирует мета-описатель директории - специальный файл примерно такого вида:
parentname:Коровники и телятники
parentdir:korovniki_i_telyatniki
foldername:Телятник 1904 год
folderdir:telyatnik_1904_god
filename:Боковой фасад.jpg
filebase:bokovoj_fasad.jpg
filename:План.jpg
filebase:plan.jpg
filename:Поперечный разрез.jpg
filebase:poperechnyj_razrez.jpg
filename:Попреречный фасад.jpg
filebase:poprerechnyj_fasad.jpg
вобщем, одна из проблем была в том, что необходимо было после считывания обязательно выполнять trim() - по причине наличия непонятно откуда взявшихся пробелов.
Но это только одна из проблем.
Все же с UTF-8 пхп как то весьма не однозначно работает. Хотя, по идее для латиницы вообще проблем быть не должно.
Ну либо я что-то не понимаю.
так вот - а как их удалить?
Точнее, знаю, что удалять так можно, а с переименованием не сталкивался. Может еще натолкнет на мысли этот материал.
Если дело в файле с именами, то там можно невидимки укоцать с помощью hex-редактора, с опциями отображения всего печатного как простого текста (для аски такое точно есть, для юникода наверняка тоже). Все, что не текст - коцать.
clearstatcache(true, $file);
if (file_exists($file)) {
echo 'Файл существует!';
} else {
echo 'Такого файла не существует!';
}
Порча постигает юзеров гавнохостинги юзающих с php < 5.3 версией.
Имена файлов однозначно в восьмибитной кодировке. Разве нет?
Нет. В linux-ах имена файлов есть байт последовательность обычная и может быть записана в любой кодировке или без оной вовсе. Ибо определил создатель inode-ы и знал он, что это хорошо.