файлы в никсах носят имена начинающиеся с с точки. пропуск по условию "если первый символ в имени - точка" это конечно круто, но просто так не убрать. в каждом каталоге существует два специальных указателя: точка - на самого себя, и точка-точка - на родительский каталог. для решения твоей задачи нужно заменить логику условия с "поиск точки в первом символе" на "сравнение всего имени со значениями точка и точка-точка". Добавлено спустя 37 секунд: ого. я разместил ответ раньше вопроса. ё6ушки-воробушки как же я крут...
В инете нашёл программу вывод списка файлов и я ей пользуюсь, но эта программа не выводит скрытые файлы, я пытался комментировать условие(в строке " // пропустить скрытые файлы"), но получаю ошибку, как сделать, чтоб приведённая ниже программа, выводила скрытые файлы Код (PHP): <?php // Оригинальный код - Chirp Internet: www.chirp.com.au // Пожалуйста, укажите это в хедере, если будете использовать данный код function getFileList($dir, $recurse=false, $depth=false) { // массив, хранящий возвращаемое значение $retval = array(); // добавить конечный слеш, если его нет if(substr($dir, -1) != "/") $dir .= "/"; // указание директории и считывание списка файлов $d = @dir($dir) or die("getFileList: Не удалось открыть каталог $dir для чтения"); while(false !== ($entry = $d->read())) { // пропустить скрытые файлы if($entry[0] == ".") continue; if(is_dir("$dir$entry")) { $retval[] = array( "dname" => "$dir$entry/", "size" => 0, "lastmod" => filemtime("$dir$entry") ); if($recurse && is_readable("$dir$entry/")) { if($depth === false) { $retval = array_merge($retval, getFileList("$dir$entry/", true)); } elseif($depth > 0) { $retval = array_merge($retval, getFileList("$dir$entry/", true, $depth-1)); } } } elseif(is_readable("$dir$entry")) { $retval[] = array( "fname" => "$dir$entry", "file_type" => filetype("$dir$entry"), "file_size" => filesize("$dir$entry"), "file_crc" => crc32(file_get_contents("$dir$entry")), "file_lastmod" => filemtime("$dir$entry") ); } } $d->close(); return $retval; } $if=fopen("sss.txt","w"); $file = getFileList("/var/www/primer", true); fwrite($if,print_r($file, 1)); fclose($if); ?> Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
спасибо, я так и подозревал... вместо комментирования этого условия if($entry[0] == ".") continue;, надо его дополнить типа и длина слова больше одного, то это скрытый файл..
ты читать умеешь? никакой длины не надо проверять. у тебя фиксированный список из точки и точки-точки. всё остальное - не попадает под условие вне зависимости от длины, ширины, высоты, цвета, размера зарплаты, политических взглядов, положения звёзд, и тд и тп
После этой команды $d = @dir($dir), я получаю в переменной d массив d[0]="." d[1]=".." d[2]=".скрытыйфайл" d[3]="ещёкакойтофайл" дальше цикл и условие if($entry[0] == "."), которое я могу изменить на if($entry[0] == "." and strlen($entry[0])=1) следовательно это каталог...
ты понимаешь что тут полный бред написан? если первый символ строки - точка - ок. тут не бред. не ты писал поэтому не бред. бред дальше. итак. логикой И нам тут добавлено следующее выражение... ох ща блин как же эта жесть звучит-то... даже подумать страшно... присвоить единицу результату выполнения функции получения длины строки, в которую в свою очередь передать первый символ строки содержащейся в переменной энтри. длина первого символа всегда будет равна единице. он же один. первый. когда ты сравниваешь значения на равенство надо писать два равно а не одно. за пять лет такие моменты нужно было бы выучить. Добавлено спустя 24 секунды: это пи3дец...
Если первый символ элемента массива entry[] точка, то проверяем этот элемент дальше{если этот элемент строго равен "." или "..", то возвращаемся к началу цикла и переходим к следующему элементу массива},
Помимо синтаксической ошибке во втором if-е, вообще зачем проверять первый символ? Достаточно проверить на строгое равенство . или ... И кстати, строгое равенство ===
Только это не просто точки, а ./ и ../ в имени. Почему про слэш все забывают при проверках пути? Это не вопрос точки или двух точек. Это вопрос точкислэша и двухточекслэша. В любом случае, если после последней точки есть слэш - это указатель на каталог(и) выше или на свой, если не слэш - это скрытый файл. А еще есть basename, который однозначно срежет все, кроме имени файла и там достаточно просто проверить, есть точка или нет. В чем проблема-то собсна?
сорри, но бред. я вообще не знаю что у меня в каталоге творится. вообще не должен этого знать. я просто вижу имя элемента и ввожу его. файловая система сама знает куда ссылается это имя - каталог, файл, блочное устройство, симлинк и так далее и тому подобное. Код (PHP): # cd / # file .. ..: directory # file run run: directory # file initrd.img initrd.img: symbolic link to `boot/initrd.img-3.13.0-83-generic' # file boot/initrd.img-3.13.0-83-generic boot/initrd.img-3.13.0-83-generic: gzip compressed data, from Unix, last modified: Mon Mar 14 22:23:43 2016 пых при листинге каталога тоже выводит почему-то именно точка-дветочки и без всяких там слешей. пропробуй прилепить слеш при сравнении и ты уже не отфильтруешь ничего. просто потому что точки-слэша не будет. будет просто точка.
Проблема в том, что я только вчера увидел PHP, и по наивности думал, что в PHP есть хоть какой-то дебугер, чтоб пройти по шагам, эту программу на хостинге..., хоть и вставляю всякие echo, тип посмотреть и т.д. но только запутываюсь... if($entry[0] == ".") continue; Я предполагаю, что entry это массив, entry[0] == "." для меня первый элемент массива и проверка на ".", но как понял из постов выше это сравнение не первого элемента, а первого знака первого элемента массива.... Я давай всё обкладывать этими echo, но трудно без дебугера...
в мануале все написано. прежде чем реализовывать какие-то задачи на каком-то языке - неплохо изучить основы его синтаксиса. решение проблемы уже тоже давно несколько часов назад. я даже просил отдельно переписать мой словесный алгоритм на лексемы пхп. а ты пока продолжаешь измерять длину первого символа в строке...
есть, но не в ядре PHP, а подключаемый извне - xDebug. Если правильно подключить к IDE, то работает канонично-православно с брейкпоинтами, вотчами, коллстеками, и прочими экспрешнами.
всё можно тему закрыть, изменил условие if($entry[0]== ".") {continue;} на if($entry[0]== "."&& !is_file("$dir$entry")) {continue;}
Ты взял "сложную строку", в которой нет ни одного символа, кроме двух переменных, которые тебе надо сконкатенировать. У меня мозг щас взорвется от настолько индусской конкатенации. На, теперь так кури: Код (PHP): is_file($dir.$entry) Мне страшно представить, что в остальном коде творится, если даже настолько очевидные вещи решаются неочевидными нечитабельными способами.
Я исхожу из условия, тот кто писал эту программу по уровню пхп меня выше, и следовательно я просто скопировал это слияние двух переменных из кода приведённого выше (if(is_dir("$dir$entry")) ), не вникая почему он так это сделал.. может такая конструкция обоснована алгоритмом написавшего, но про конкатенацию в виде точки я знаю, поэтому спасибо за замечание, сейчас я исправлю...
Никогда так не делай. Никогда не копируй абы что, не вникая. НИ КО ГДА. Если надо стырить чужой сниппет, прочитай, разберись, только потом копируй. все проще - она обоснована его тягой к индуизму.
[offtop] а что, ты хочешь вступить в патентный спор? моя раньше! кстати, похоже, честный патент на машину времени нельзя получить - всегда есть возможность переместиться на время чуть раннее, чем у конкурентов, и предоставить машину там.