Команда PHP lstat не различает ярлыки в окнах

В Windows я открываю каталог, читаю файлы и для каждого файла запускаю stat, чтобы определить размер и т. д.

Проблема в том, что когда я запускаю stat для папки SHORTCUT, она возвращается как ПАПКА, и я не вижу ничего в битовой маске mode, что могло бы указывать на это. Это верно для всех ярлыков папок в c:\Documents and Settings\myUserName\.

Для этих сочетаний клавиш is_file возвращает false, is_dir возвращает true, а is_link не поддерживается в XP.

Вот выдержка из моего кода (он был урезан, поэтому могут быть ошибки):

if(($h=@opendir($root))!==false){
    while (false !== ($file = readdir($h))){
        if(!($file=="." || $file=="..")){
            if( $stat = @lstat($root . $file) ){
                $ary[0] = $file;
                $ary[1] = $root;
                $ary[2] = Date("m/d/y H:i:s", $stat['mtime']);
                if($stat['mode'] & 040000){
                    $ary[3]="dir";
                    $ary[4]=0;
                }else{
                    $ary[3] ="file";
                    $ary[4] = $stat['size'];
                }
                echo(json_encode($ary));
            }
        }
    }
}

Обходной путь для этого будет оценен ...

EDIT: решение Winterblood почти сработало

Прежде всего - мой плохой - это машина с Win7.

Спасибо Winterblood за быстрое решение - это сработало для нескольких ярлыков, и в руководстве по PHP говорится именно об этом... Однако,

c:\users\myUserName\AppData\Local\Данные приложения

(и другие) по-прежнему возвращаются как каталоги, в то время как winSCP правильно видит их как ярлыки. На самом деле «режим» — 040777, что точно такое же, как и у многих реальных папок.

Любые другие предложения?


person alfadog67    schedule 09.05.2013    source источник


Ответы (1)


Функция PHP stat() "следует" за ярлыками/символическими ссылками, сообщая подробности о связанном файле/папке, а не о самой фактической ссылке.

Для получения статистики по самой ссылке используйте lstat().

Дополнительные сведения см. в документации PHP по lstat.

person Ken Herbert    schedule 09.05.2013
comment
Черт возьми - я набрал маленькую букву "л" в своем коде и услышал колокольчики ангелов. - person alfadog67; 10.05.2013
comment
Почти сделал это... Я поправил свой первоначальный пост, чтобы отразить текущую ситуацию. - person alfadog67; 10.05.2013
comment
Насколько я знал, %LocalAppData% была настоящей папкой. Если lstat сообщает, что это настоящая папка, но WinSCP сообщает об этом как о ссылке, я бы больше сомневался в программном обеспечении, а не в языке. - person Ken Herbert; 11.05.2013
comment
спасибо за понимание - вы правы... На самом деле, когда я щелкаю правой кнопкой мыши c:\users\me\Local Settings\Application Data (у которого есть наложение ярлыка на значок, он сообщает, что это настоящая папка с файлами, а Однако на самом деле он ссылается на себя, и когда я его открываю и продолжаю открывать в подпапке, в итоге мой путь выглядит так: c:\users\me\Local Settings\Application Data\ Application Data\. WinSCP этого не делает — он просто остается в исходной папке. Моя цель — выяснить, как воспроизвести это для вложенного readdir(). Может ли is_link() помочь с этим? - person alfadog67; 15.05.2013
comment
Хорошо, я бегло просмотрел его. C:\Users\username\Local Settings — это место для локальных данных в WinXP. В Win7 они обновили его до C:\Users\username\AppData\Local. Для обратной совместимости старый путь к локальным параметрам существует как точка соединения . Точки соединения не предназначены для доступа пользователя — перейдите по ссылке для получения дополнительной информации, в том числе о том, как их идентифицировать. - person Ken Herbert; 16.05.2013
comment
Что ж, между всей тяжелой работой, проделанной @winterblood, и предположениями, которые я делаю, вот (предполагаемый) ответ: рассматриваемые папки (те, которые я не хочу повторять, потому что они являются точками соединения) имеют lstat ['режим'] & 040006. Вот и все. Если lstat['mode'] & 040006, то не следуйте ему. Winterblood, большое спасибо за ваш труд. Вы, безусловно, цените эту планету. - person alfadog67; 17.05.2013
comment
Рад помочь. Я всегда рад видеть, что моя помощь используется, и всегда есть вероятность, что то, чему мы здесь научились, поможет мне и в будущем. - person Ken Herbert; 18.05.2013