За последние 24 часа нас посетили 23742 программиста и 1549 роботов. Сейчас ищут 1033 программиста ...

Как вывести скрытые файлы

Тема в разделе "PHP для новичков", создана пользователем Ganzal, 21 мар 2016.

  1. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    файлы в никсах носят имена начинающиеся с с точки. пропуск по условию "если первый символ в имени - точка" это конечно круто, но просто так не убрать. в каждом каталоге существует два специальных указателя: точка - на самого себя, и точка-точка - на родительский каталог.

    для решения твоей задачи нужно заменить логику условия с "поиск точки в первом символе" на "сравнение всего имени со значениями точка и точка-точка".

    Добавлено спустя 37 секунд:
    ого. я разместил ответ раньше вопроса. ё6ушки-воробушки как же я крут...
     
  2. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    В инете нашёл программу вывод списка файлов и я ей пользуюсь, но эта программа не выводит скрытые файлы, я пытался комментировать условие(в строке " // пропустить скрытые файлы"), но получаю ошибку, как сделать, чтоб приведённая ниже программа, выводила скрытые файлы
    Код (PHP):
    1. <?php
    2.   // Оригинальный код - Chirp Internet: www.chirp.com.au
    3.   // Пожалуйста, укажите это в хедере, если будете использовать данный код
    4.  
    5.   function getFileList($dir, $recurse=false, $depth=false)
    6.   {
    7.     // массив, хранящий возвращаемое значение
    8.     $retval = array();
    9.  
    10.     // добавить конечный слеш, если его нет
    11.     if(substr($dir, -1) != "/") $dir .= "/";
    12.  
    13.     // указание директории и считывание списка файлов
    14.     $d = @dir($dir) or die("getFileList: Не удалось открыть каталог $dir для чтения");
    15.     while(false !== ($entry = $d->read())) {
    16.  
    17.       // пропустить скрытые файлы
    18.       if($entry[0] == ".") continue;
    19.       if(is_dir("$dir$entry")) {
    20.         $retval[] = array(
    21.           "dname" => "$dir$entry/",
    22.           "size" => 0,
    23.           "lastmod" => filemtime("$dir$entry")
    24.         );
    25.         if($recurse && is_readable("$dir$entry/")) {
    26.           if($depth === false) {
    27.             $retval = array_merge($retval, getFileList("$dir$entry/", true));
    28.           } elseif($depth > 0) {
    29.             $retval = array_merge($retval, getFileList("$dir$entry/", true, $depth-1));
    30.           }
    31.         }
    32.       } elseif(is_readable("$dir$entry")) {
    33.         $retval[] = array(
    34.           "fname"         => "$dir$entry",
    35.           "file_type"    => filetype("$dir$entry"),
    36.           "file_size"    => filesize("$dir$entry"),
    37.           "file_crc"     => crc32(file_get_contents("$dir$entry")),
    38.           "file_lastmod" => filemtime("$dir$entry")
    39.         );
    40.       }
    41.     }
    42.     $d->close();
    43.  
    44.     return $retval;
    45.   }
    46. $if=fopen("sss.txt","w");
    47. $file = getFileList("/var/www/primer", true);
    48. fwrite($if,print_r($file, 1));
    49. fclose($if);
    50. ?>
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  3. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    спасибо, я так и подозревал...
    вместо комментирования этого условия if($entry[0] == ".") continue;, надо его дополнить типа и длина слова больше одного, то это скрытый файл..
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты читать умеешь?
    никакой длины не надо проверять. у тебя фиксированный список из точки и точки-точки. всё остальное - не попадает под условие вне зависимости от длины, ширины, высоты, цвета, размера зарплаты, политических взглядов, положения звёзд, и тд и тп
     
  5. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    После этой команды $d = @dir($dir), я получаю в переменной d массив
    d[0]="."
    d[1]=".."
    d[2]=".скрытыйфайл"
    d[3]="ещёкакойтофайл"
    дальше цикл и условие if($entry[0] == "."), которое я могу изменить на if($entry[0] == "." and strlen($entry[0])=1) следовательно это каталог...
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    напиши код который соответствует моему предложению
     
  7. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    if($entry[0] == ".") {if $entry=="." или $entry==".."continue;}
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что ты сдесь написал, можешь рассказать своими словами по шагам?
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты понимаешь что тут полный бред написан?
    если первый символ строки - точка - ок. тут не бред. не ты писал поэтому не бред. бред дальше. итак.
    логикой И нам тут добавлено следующее выражение... ох ща блин как же эта жесть звучит-то... даже подумать страшно...

    присвоить единицу результату выполнения функции получения длины строки, в которую в свою очередь передать первый символ строки содержащейся в переменной энтри.

    длина первого символа всегда будет равна единице. он же один. первый.
    когда ты сравниваешь значения на равенство надо писать два равно а не одно. за пять лет такие моменты нужно было бы выучить.

    Добавлено спустя 24 секунды:
    это пи3дец...
     
  10. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Если первый символ элемента массива entry[] точка, то проверяем этот элемент дальше{если этот элемент строго равен "." или "..", то возвращаемся к началу цикла и переходим к следующему элементу массива},
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Помимо синтаксической ошибке во втором if-е, вообще зачем проверять первый символ? Достаточно проверить на строгое равенство . или ... И кстати, строгое равенство ===
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Только это не просто точки, а ./ и ../ в имени. Почему про слэш все забывают при проверках пути? Это не вопрос точки или двух точек. Это вопрос точкислэша и двухточекслэша. В любом случае, если после последней точки есть слэш - это указатель на каталог(и) выше или на свой, если не слэш - это скрытый файл.

    А еще есть basename, который однозначно срежет все, кроме имени файла и там достаточно просто проверить, есть точка или нет.

    В чем проблема-то собсна?
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    сорри, но бред. я вообще не знаю что у меня в каталоге творится. вообще не должен этого знать. я просто вижу имя элемента и ввожу его. файловая система сама знает куда ссылается это имя - каталог, файл, блочное устройство, симлинк и так далее и тому подобное.

    Код (PHP):
    1. # cd /
    2.  
    3. # file ..
    4. ..: directory
    5.  
    6. # file run
    7. run: directory
    8.  
    9. # file initrd.img
    10. initrd.img: symbolic link to `boot/initrd.img-3.13.0-83-generic
    11.  
    12. # file boot/initrd.img-3.13.0-83-generic 
    13. boot/initrd.img-3.13.0-83-generic: gzip compressed data, from Unix, last modified: Mon Mar 14 22:23:43 2016
    пых при листинге каталога тоже выводит почему-то именно точка-дветочки и без всяких там слешей. пропробуй прилепить слеш при сравнении и ты уже не отфильтруешь ничего. просто потому что точки-слэша не будет. будет просто точка.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Подло довольно-таки с его стороны. Ок, теперь хотя бы проблема ясна. НО, basename чем не катит?
     
  15. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Проблема в том, что я только вчера увидел PHP, и по наивности думал, что в PHP есть хоть какой-то дебугер, чтоб пройти по шагам, эту программу на хостинге..., хоть и вставляю всякие echo, тип посмотреть и т.д. но только запутываюсь...
    if($entry[0] == ".") continue; Я предполагаю, что entry это массив, entry[0] == "." для меня первый элемент массива и проверка на ".", но как понял из постов выше это сравнение не первого элемента, а первого знака первого элемента массива.... Я давай всё обкладывать этими echo, но трудно без дебугера...
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в мануале все написано. прежде чем реализовывать какие-то задачи на каком-то языке - неплохо изучить основы его синтаксиса. решение проблемы уже тоже давно несколько часов назад. я даже просил отдельно переписать мой словесный алгоритм на лексемы пхп. а ты пока продолжаешь измерять длину первого символа в строке...
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    есть, но не в ядре PHP, а подключаемый извне - xDebug. Если правильно подключить к IDE, то работает канонично-православно с брейкпоинтами, вотчами, коллстеками, и прочими экспрешнами.
     
  18. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    всё можно тему закрыть, изменил условие if($entry[0]== ".") {continue;} на if($entry[0]== "."&& !is_file("$dir$entry")) {continue;}
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ты взял "сложную строку", в которой нет ни одного символа, кроме двух переменных, которые тебе надо сконкатенировать. У меня мозг щас взорвется от настолько индусской конкатенации.

    На, теперь так кури:
    Код (PHP):
    1. is_file($dir.$entry)
    Мне страшно представить, что в остальном коде творится, если даже настолько очевидные вещи решаются неочевидными нечитабельными способами.
     
  20. tmpnik

    tmpnik Активный пользователь

    С нами с:
    21 мар 2011
    Сообщения:
    50
    Симпатии:
    0
    Я исхожу из условия, тот кто писал эту программу по уровню пхп меня выше, и следовательно я просто скопировал это слияние двух переменных из кода приведённого выше (if(is_dir("$dir$entry")) ), не вникая почему он так это сделал.. может такая конструкция обоснована алгоритмом написавшего, но про конкатенацию в виде точки я знаю, поэтому спасибо за замечание, сейчас я исправлю...
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    поздравляю, теперь ты круче кого-то.
     
  22. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    if ('.' == $entry || '..' == $entry) {continue; }
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Никогда так не делай. Никогда не копируй абы что, не вникая. НИ КО ГДА. Если надо стырить чужой сниппет, прочитай, разберись, только потом копируй.
    все проще - она обоснована его тягой к индуизму.
     
  24. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    [offtop]

    Признайся, ты балуешься машиной времени!
     
  25. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    [offtop]
    а что, ты хочешь вступить в патентный спор? :D моя раньше! кстати, похоже, честный патент на машину времени нельзя получить - всегда есть возможность переместиться на время чуть раннее, чем у конкурентов, и предоставить машину там.