1. PHP / Говнокод #17004

    +145

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    function myscandir($dir){
    	if(!file_exists($dir)){
    		return false;
    	}
    
        $list = scandir($dir);
        unset($list[0],$list[1]);
        return array_values($list);
    }

    Запостил: taras_shs, 31 Октября 2014

    Комментарии (26) RSS

    • > unset($list[0],$list[1]);
      Вот кстати, всегда бесили эти . и .. Нахрена почти все либы для всех языков возвращают их?
      Ответить
      • правильней вопрос: нахера их операционки возвращают? это детали реализации файловых систем. и как раз именно те детали которые никому в Ж не нужны.
        Ответить
        • А я пользуюсь... в диреде RET на . - это удобный способ открыть новый буффер, если в старом уже много директорий открыто, .. аналогично.
          Ответить
          • > в диреде RET на .

            это ты про что?

            > А я пользуюсь...

            нет, не пользуешься. присутствие . и .. в листинге содержимого каталога не имеет ни какого отношения к конвенциям доступа к текущему каталогу или к поиску родительского каталога.
            Ответить
            • Как это не имеет?
              Подробнее: подвести указатель к "." и нажать клавишу RET. Это создает новый буффер Dired в котором отображается содержание директории на которую указывает ".".
              Одновременно может быть доступно много "." директорий, и иногда хочется выбрать только одну.
              Ответить
              • > Как это не имеет?

                еще раз для тех кто в пятницу вечером слишком трезвый.

                "." и ".." есть всего лишь конвенции для описания специальных каталогов.

                разрабу на каждом readdir()'е спотыкатся на них постоянно просто не нужно.

                диреду и прочим тулзам эти конвенции так или иначе приходится специально обрабатывать и реализовывать, потому что униформно с . или .. все равно работать не получается. на том же юнихе, все файл манагеры врут про .. из-за симлинков.
                Ответить
                • И как это значит, что они не связаны? Имена файлов - такая же конвенция, например в них можно использовать * и ?, хотя в настоящих именах их нет, а в ДОСе можно использовать еще и ~.
                  Нет, Dired ничего специального не делает для "." или "..", просто обращается к ls с полученым именем.
                  Ответить
                  • > И как это значит, что они не связаны?

                    это просто статические пропертисы каталога. разраб знает что они есть. а пользователю до лампочки.

                    > Нет, Dired ничего специального не делает

                    блин.

                    помедитируй над тем что именно происходит в этом шелл коде:
                    cd /tmp
                    mkdir -p aaa/bbb
                    ln -s aaa/bbb ccc
                    cd ccc
                    cd ..

                    подсказка: почему в конце ты опять оказываешься в /tmp а не в /tmp/aaa??
                    Ответить
                    • В каком смысле "почему"? В смысле почему решили, что это желаемое поведение? - я не знаю, но и вопрос такой не возникал. Только это всеравно не говорит о том, что нет связи. Чтобы показать отсутсвие связи нужно продемонстрировать, что поведение не соответствует гипотезе о том, что связь есть. Сколько раз я бы не переходил в директорию по ссылке ".", я всегда попадаю в текущую директорию, а если перехожу по ссылке "..", то попадаю в директорию на уровень выше (при условии, что такая есть). Есть ли там конкретные айноды, цилиндры и записи на носителе и т.д. - не отменяет наличие связи.
                      Ответить
                      • > Чтобы показать отсутсвие связи нужно продемонстрировать, что поведение не соответствует гипотезе о том, что связь есть.
                        О, как в старые добрые времена до появления автогенератора.

                        Я спрашиваю, какие объекты лежат в указанном каталоге. Мне говорят, что там кроме того, что должно лежать, присутствует сам каталог (это ещё ладно, может такая геометрия резиновая), родительский каталог (как пихнули-то?) и где-то рядом на плоскости лежит голый мужик. И приходится людям фильтровать этот мусор для корректной обработки только потому, что одна из фич эмакса пользуется им. Идею мусорных точечек можно развить и добавить в список папок ещё и *, *.txt, *.exe, *.sh для удобства пользователей и более простой эмуляции функции "группировка по типу" из Windows Explorer.

                        Точки как договорённость есть в каждом каталоге. Нет смысла сообщать о них специально и ломать иерархию. Для родительского каталога можно предоставить всем желающим флаг "есть родитель", не более того. Уж можно было захардкодить точки в парочке утилит вроде dir и ls, которые нарочно их выводят вместо притягивания мусора за уши.
                        Ответить
                        • Никто не говорит, что там лежит этот или родительский каталог, там лежит ссылка. Ссылка может быть на что угодно, включая и текущих каталог и родительский.
                          Ответить
                        • Есть смысл сообщать, например, если родительский каталог недоступен, то это можно отобразить. (Хотя, почему-то так не делают). Находясь внутри директории, обращение к . даст нужную информацию про владельца и настройки доступа так же, как это было бы сделано для других файлов.

                          Вобщем, я не понимаю сути народных мытарств и возмущения по поводу наличия этих файлов в списке содержания директорий. Мне они не только не мешают, но я даже ими иногда пользуюсь.
                          Ответить
                          • Да не в списке же, отображаемом юзеру, который выводят всякие mc да dired, в котором эти ".." имеют смысл (и в который их всегда можно было бы дорисовать, даже если бы readdir() их не вернул)...

                            А в программных интерфейсах типа readdir(), где они нахер не сдались, и в 99% случаев их приходится вычеркивать из результатов.
                            Ответить
                            • Я думаю, что проблема не в этом, а в том, что случаи когда .. или . нет в этом списке - либо экзотика, либо [больше] не существуют. Но теоретически я не вижу проблемы в том, что какая-нибудь папка может вдруг не предоставлять . или .. - может быть так где-то и происходит. Я не знаю, что на этот счет говорят стандарты.
                              Ответить
                              • Проблема в том, что всем программам, использующим readdir() или обертки над ним приходится выбрасывать нахер эти "." и "..". Т.е. делать лишнюю и бесполезную работу. Есть там точка или нет там точки - 99.9% софта вообще похуй. Скорее всего даже mc и dired их тупо выбрасывают из результатов скана.

                                Слава богу питоний os.listdir, Qt и жабий DirectoryStream писали здравомыслящие люди, которые додумались выкинуть этот мусор самостоятельно и не возвращать его среди результатов.
                                Ответить
                                • Да и в Node.JS fs.readdir убивает точки. И в .NET в Directory.getDirectories (хотя, это уже уровень повыше) их нет.
                                  Ответить
                      • > а если перехожу по ссылке "..", то попадаю в директорию на уровень выше

                        пример как раз и демонстрирует что ты *НЕ* попадаешь в директорию уровнем выше. а в директорию которая только кажется уровнем выше.

                        потому что /tmo/ccc это симлинк на /tmp/aaa/bbb, в bbb ".." указывает на /tmp/aaa, а не на /tmp.

                        ЗЫ а теперь по приколу напиши прогу (или перловый/этц скрипт) которая повторяет все эти шаги. и ты заметишь что у проги в конце будет текущий каталог /tmp/aaa.
                        Ответить
                        • Ничего такого пример не демонстритует. Посмотри, что выводит pwd, после того, как ты переходишь в ccc.

                          И вообще, с чего вы взяли, что оно должно работать каким-то определенным способом отличным от того, каким оно работает сейчас? У меня есть такое подозрение, что это просто пример прототипного мышления. Т.е. когда человек систематизирует знания опираясь на типичных представителей класса (в отличие от онтологии, например). С такой точки зрения воробей более птица, чем, скажем, пингвин (потому что типичные птицы летают). Точно так же, кто-то решил, что определенная метарфора (например, вложенности) применима к файловой системе. Потом выбрал типичный экземпляр этой метафоры, например, матрешку, и когда "не типичный" экземпляр - файловая система не соответствует по всем параметрам матрешки, негодует.

                          Никто ж не высказывал никаких обещаний о том, что папки будут всегда вложены так, что из них можно будет сделать направленый граф без циклов. Как правило это таки дерево, но вряд ли кто-то в здравом уме стал бы настаивать на том, что это должно быть дерево.
                          Ответить
                          • С помощью fuse можно и бесконечный фрактальный лабиринт замутить... но... зачем?
                            Ответить
                            • Мы говорим об ограничениях а не о практичности. А так вообще есть файловые системы, где даже директорий нет, только файлы, и живут как-то.
                              Ответить
                              • > где даже директорий нет, только файлы, и живут как-то
                                Это всего лишь вырожденный случай системы с директориями.
                                Ответить
                            • Лабиринт можно замутить и без fuse. Например, на той же FAT вручную проставить адреса первого кластера для нескольких директорий, чтобы в графе возникли циклы.
                              Ответить
                              • Но с fuse его можно сделать не только гигантским, но и рандомным, и динамически изменяющимся...
                                Ответить
                    • Неужели информация из .. никак не используется, а cd .. тупо отрезает от текущего каталога то, что после последнего слеша? Да это же грязный хак!
                      Ответить
      • совместимость-с
        Ответить
    • В опостылевшем похапе, для осуществления оного задуманного в теме поста, есть, не очень популярная, почему-то, функция: glob( $dir . '/*' );
      Ответить

    Добавить комментарий