в общем у меня такая задумка... в локалке много компов с расшаренными фильмами... хочу написать скрипт индексации файлов и заноса их в mysql. А потом соответсвенно поиск по этим данным. Но на самом первом шаге уже проблема(( ип 192.168.34.23 соответсвенно чтобы посмотреть папки, к которым пользователь открыл доступ - надо набирать \\192.168.34.23 я пишу PHP: $handlee = opendir('\\192.168.34.154'); while (false !== ($file = readdir($handlee))) { echo $file; } но выдает ошибку вопрос: какой функцией можно заходить в расшаренные директории??
Щас проверил - opendir не читает расшаренные папки, хотя, например, copy копирует файлы без проблем: Код (Text): copy('\\\xxx.xxx.xxx.xxx\Video123\monstro.avi', 'D:\123.avi'); glob() тоже не читает. Так что тоже стало интересно, как еще можно прочитать расшаренныё каталог.
Вобщем, что-то я захотел сделать поисковик по локалке, надоело искать всё руками Как я понял, функции PHP не могут читать расшареные папки. Подскажите системную команду, которая бы это сделать смогла. Код (Text): dir \\xxx.xxx.xxx.xxx в командной строке выводит синтаксическую ошибку. Функция system(), соответственно, выводит пустоту. Как там правильно это сделать?)
Вроде как, надо прописать в свойствах апача подключаться от имени того пользователя для которого разрешён доступ к файлам по сети. зы. почитай про net view
Да, это уже нашел И даже начал что-то писать, но отложил до завтра PHP: <pre> <? $ip = 'xxx.xxx.xxx.xxx'; exec('net view '.$ip, $shared); foreach($shared as $key=>$value) { $shared[$key] = iconv('866', 'cp1251', $value); } print_r($shared); ?> спс, поищу.
Всё же решил юзать exec. Вобщем, такой вопрос возник. Если компьютер не в сети, или выключен, у винды таймаут до того, как она поймет, что он выключен, секунд 20, что меня, естественно, неустраивает. Диапазон из 255 ип, тоесть будет работать эта штука сильно уж долго. Надо перед сканированием делать проверку компьютера. Пинговать выключеные тоже долго. Смотрел в сторону gethostbyaddr(), тоже долго обрабатывает "мертвые". В локалке ответ "живого" должен лежать в пределах 1 секунды... Неохото делать таймер в скрипте, 90% есть какой-то быстрый способ узнать, в сети ли компьютер. Сам я далёк от команд винды, кто знает, помогите, может, какие-то стандартные функции есть upd: чуть не забыл: PHP: <pre> <? $ip = 'xxx.xxx.xxx.xxx'; $on = proverka($ip); //Вот тут надо как-то быстро узнать, в сети ли компьютер... if($on !== false) { exec('net view '.$ip, $shared); $shared = array_slice($shared, 7, -2); foreach($shared as $key=>$value) { $shared[$key] = iconv('866', 'cp1251', $value); if(!stristr($shared[$key], ' Disk') && !stristr($shared[$key], ' Диск')) unset($shared[$key]); } print_r($shared); } else { echo 'Сканируем следующий ип из диапазона.'; } ?>
иными словами PHP: <?php $servers = `net view`; ?> запишет в $servers информацию о всех включенных компах в сети
все равно чет непонял я как тут че работает. вот пишу код PHP: $ip = '192.168.34.23'; exec('net view '.$ip, $shared); $shared = array_slice($shared, 7, -2); foreach($shared as $key=>$value) { $shared[$key] = iconv('866', 'cp1251', $value); if(!stristr($shared[$key], ' Disk') && !stristr($shared[$key], ' Диск')) unset($shared[$key]); } print_r($shared); выдает все нормально а вот если я хочу посмотреть что находится в папке \\192.168.34.23\Фильм что надо в код добавить??
netruxa Вначале необходимо отделить само имя ресурса от "Диск". Дальше обходить все эти ресурсы, но уже командой dir. Тоесть каждую расшаренную папку сканить так: Код (Text): dir \\192.168.34.23\Фильмы Потом файлы влево, папки вправо. Папки снова обходить. Всё это делается, например, рекурсией, как и любой "свой" каталог.
так с dir таже проблема что и с opendir!!! не отображает расшаренные файлы(( если будет свободное время, кинешь код ок? спасибо
netruxa Ты ничего не понял. Введи в командную строку "dir \\192.168.34.23\Фильмы" и посмотри вывод. Именно этот вывод и парсит скрипт, а получает функцией exec. У тебя же русская винда? Выложи вывод от команы dir \\192.168.34.23\Фильмы, или любой другой папки вместо Фильмы. Мне надо знать, как там идет перевод слова <dir>, чтобы сделать кросязыковый скрипт.
cmd --> dir \\192.168.34.23\test Microsoft Windows XP [Версия 5.1.2600] (С) Корпорация Майкрософт, 1985-2001. C:\Documents and Settings\neTruxa>dir \\192.168.34.23\test Том в устройстве \\192.168.34.23\test имеет метку Софт Серийный номер тома: B4BF-044E Содержимое папки \\192.168.34.23\test 21.04.2008 00:10 <DIR> . 21.04.2008 00:10 <DIR> .. 17.04.2008 01:52 109 568 1.doc 05.09.2003 17:09 11 893 info.htm 21.04.2008 00:10 <DIR> subtest 17.04.2008 01:52 109 568 Копия 1.doc 05.09.2003 17:09 11 893 Копия info.htm 21.04.2008 00:10 <DIR> русская версия тест 4 файлов 242 922 байт 4 папок 15 426 351 104 байт свободно C:\Documents and Settings\neTruxa>
Вот класс, достаёт все файлы заданного компьютера. PHP: <? set_time_limit(0); class LanScaner { private $files = false; /* Метод сканирует все расшаренные папки Возвращает их в виде массива */ public function shared($ip) { exec('net view '.$ip, $shared); $shared = array_slice($shared, 7, -2); foreach($shared as $key=>$value) { $shared[$key] = iconv('866', 'cp1251', $value); if(!stristr($shared[$key], ' Disk') && !stristr($shared[$key], ' Диск')) unset($shared[$key]); else { $shared[$key] = str_replace(array(' Disk', ' Диск'), array('', ''), $shared[$key]); $shared[$key] = trim($shared[$key]); $this->scaner($ip.'\\'.$shared[$key]); } } return $shared; } /* Метод сканирует каждую расщаренную папку. Записывает все нужные файлы в $this->files */ public function scaner($res) { exec('dir "\\\\'.$res.'"', $folders); $folders = array_slice($folders, 7, -2); foreach($folders as $key=>$value) { $value = iconv('866', 'cp1251', $value); if(!strstr($value, '<DIR>')) { $value = substr($value, 36, strlen($value)); $value = '\\\\'.$res.'\\'.$value; $this->files[] = $value; } else { $value = explode('<DIR>', $value); $value = trim($value[1]); $this->scaner($res.'\\'.$value); } } } /* Метод фильтрует файлы на предмет нужных. передавать массив c нужными расширениями файлов. */ public function filter($filter) { if($this->files == false) { die('КОмпьютер не был сканирован.'); } else { $needs = array(); foreach($this->files as $value) { $ext = explode('.', $value); $ext = $ext[count($ext)-1]; if(in_array($ext, $filter)) { $needs[] = $value; } } } $this->files = $needs; return $needs; } /* Метод ищет среди файлов нужные. $str - строка, которую искать в каждом файле $mode - может принимать 2 значения: 1 - любое совпадение 2 - строгий отбор */ public function search($str, $mode = 1) { if($this->files == false) { die('КОмпьютер не был сканирован.'); } else { $needs = array(); if($mode === 1) { foreach($this->files as $value) { if(stristr($value, $str)) { $needs[] = $value; } } } elseif($mode === 2) { foreach($this->files as $value) { if($value == $str) { $needs[] = $value; } } } else die('Передано неверное значение.'); $this->files = $needs; return $needs; } } public function result() { return $this->files; } } ?> Использовать так: PHP: <?php $lan = new LanScaner(); $lan->shared('xxx.xxx.xxx.xxx'); //Вначале сканировать. Всегда обязательно вызывать этот метод самым первым. Передавать ип нужного компьютера. $lan->filter(array('avi', 'wmv', 'mpg', 'mpeg')); //Можно применить фильтр. Передавать все нужные расширения в массиве. $lan->search('Рэмбо', 1); //Можно найти что-то среди отфильтрованных файлов. print_r($lan->result()); //Выводим всё. ?> netruxa Класс в зачаточном состоянии, писал лишбы работало, дальше сам переделай как тебе нужно
Да я тоже его юзаю, несмотря что находит почему-то только каждый второй компьютер. Хочу реализовать несколько своих фич вроде карты сети и мультипоиска ) ЗЫ: Да и просто делать нефиг, вот и пишу всякую дрянь на досуге
+Sten+ спасибо тебе конешно большое за то что не поленился и такой код написал, но у меня не работает(( все скопировал, вставил PHP: $lan->shared('192.168.34.23'); а выдает
а не нормально рабит... поторопился тебя упрекать)) убрал фильтр и поиск PHP: //$lan->filter(array('avi', 'wmv', 'mpg', 'mpeg')); //Можно применить фильтр. Передавать все нужные расширения в массиве. //$lan->search('Рэмбо', 1); //Можно найти что-то среди отфильтрованных файлов. и выдает нормально весь список файлов... а мне именно это и надо было...СПАСИБО ТЕБЕ БОЛЬШОЕ! теперь это все занесу в базу и сделаю поиск
ааа во я лошара. намного проще дать буковку какому нить расшаренному ресурсу и мона сканировать по обычной схеме например - \\192.168.34.23\Фильм = w: PHP: $handlee = opendir('W:\\'); while (false !== ($file = readdir($handlee))) { echo '<br>'.$file; } блиин во я заморочился то вначале... не подумал(