За последние 24 часа нас посетили 17772 программиста и 1652 робота. Сейчас ищут 974 программиста ...

индексирование расшареных файлов

Тема в разделе "PHP для новичков", создана пользователем netruxa, 19 апр 2008.

  1. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    в общем у меня такая задумка... в локалке много компов с расшаренными фильмами... хочу написать скрипт индексации файлов и заноса их в mysql. А потом соответсвенно поиск по этим данным. Но на самом первом шаге уже проблема((
    ип 192.168.34.23 соответсвенно чтобы посмотреть папки, к которым пользователь открыл доступ - надо набирать \\192.168.34.23
    я пишу
    PHP:
    1. $handlee = opendir('\\192.168.34.154');
    2. while (false !== ($file = readdir($handlee))) {
    3. echo $file;
    4.  }
    но выдает ошибку
    вопрос: какой функцией можно заходить в расшаренные директории??
     
  2. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    '\\\192.168.34.154'
    три слеша ставь, так как 1 экранируется следующим.
     
  3. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Щас проверил - opendir не читает расшаренные папки, хотя, например, copy копирует файлы без проблем:
    Код (Text):
    1. copy('\\\xxx.xxx.xxx.xxx\Video123\monstro.avi', 'D:\123.avi');
    glob() тоже не читает. Так что тоже стало интересно, как еще можно прочитать расшаренныё каталог.
     
  4. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Вобщем, что-то я захотел сделать поисковик по локалке, надоело искать всё руками :)

    Как я понял, функции PHP не могут читать расшареные папки. Подскажите системную команду, которая бы это сделать смогла.
    Код (Text):
    1. dir \\xxx.xxx.xxx.xxx
    в командной строке выводит синтаксическую ошибку. Функция system(), соответственно, выводит пустоту. Как там правильно это сделать?)
     
  5. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    +Sten+, без слэший, наверное. :)
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Вроде как, надо прописать в свойствах апача подключаться от имени того пользователя для которого разрешён доступ к файлам по сети.

    зы. почитай про net view
     
  7. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Да, это уже нашел :) И даже начал что-то писать, но отложил до завтра :)
    PHP:
    1. <pre>
    2. <?
    3. $ip = 'xxx.xxx.xxx.xxx';
    4. exec('net view '.$ip, $shared);
    5. foreach($shared as $key=>$value) {
    6.   $shared[$key] = iconv('866', 'cp1251', $value);
    7. }
    8. print_r($shared);
    9. ?>
    спс, поищу.
     
  8. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Всё же решил юзать exec. Вобщем, такой вопрос возник. Если компьютер не в сети, или выключен, у винды таймаут до того, как она поймет, что он выключен, секунд 20, что меня, естественно, неустраивает. Диапазон из 255 ип, тоесть будет работать эта штука сильно уж долго. Надо перед сканированием делать проверку компьютера. Пинговать выключеные тоже долго. Смотрел в сторону gethostbyaddr(), тоже долго обрабатывает "мертвые". В локалке ответ "живого" должен лежать в пределах 1 секунды...

    Неохото делать таймер в скрипте, 90% есть какой-то быстрый способ узнать, в сети ли компьютер. Сам я далёк от команд винды, кто знает, помогите, может, какие-то стандартные функции есть :)

    upd: чуть не забыл:
    PHP:
    1.  
    2. <pre>
    3. <?
    4. $ip = 'xxx.xxx.xxx.xxx';
    5. $on = proverka($ip); //Вот тут надо как-то быстро узнать, в сети ли компьютер...
    6. if($on !== false) {
    7.   exec('net view '.$ip, $shared);
    8.   $shared = array_slice($shared, 7, -2);
    9.   foreach($shared as $key=>$value) {
    10.     $shared[$key] = iconv('866', 'cp1251', $value);
    11.     if(!stristr($shared[$key], '  Disk') && !stristr($shared[$key], '  Диск'))
    12.      unset($shared[$key]);
    13.   }
    14.   print_r($shared);
    15. }
    16. else {
    17.   echo 'Сканируем  следующий ип из диапазона.';
    18. }
    19. ?>
    20.  
    21.  
     
  9. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    иными словами
    PHP:
    1. <?php
    2. $servers = `net view`;
    3. ?>
    запишет в $servers информацию о всех включенных компах в сети
     
  10. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Luge
    Спасибо!
     
  11. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    все равно чет непонял я как тут че работает. вот пишу код
    PHP:
    1.  $ip = '192.168.34.23';
    2.  
    3.    exec('net view '.$ip, $shared);
    4.    $shared = array_slice($shared, 7, -2);
    5.  
    6.  
    7.    foreach($shared as $key=>$value) {
    8.      $shared[$key] = iconv('866', 'cp1251', $value);
    9.      if(!stristr($shared[$key], '  Disk') && !stristr($shared[$key], '  Диск'))
    10.      unset($shared[$key]);
    11.    }
    12.    print_r($shared);
    выдает все нормально
    а вот если я хочу посмотреть что находится в папке \\192.168.34.23\Фильм что надо в код добавить??
     
  12. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    netruxa
    Вначале необходимо отделить само имя ресурса от "Диск". Дальше обходить все эти ресурсы, но уже командой dir. Тоесть каждую расшаренную папку сканить так:
    Код (Text):
    1. dir \\192.168.34.23\Фильмы
    Потом файлы влево, папки вправо. Папки снова обходить. Всё это делается, например, рекурсией, как и любой "свой" каталог.
     
  13. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    так с dir таже проблема что и с opendir!!! не отображает расшаренные файлы(( если будет свободное время, кинешь код ок? спасибо
     
  14. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    netruxa
    Ты ничего не понял. Введи в командную строку "dir \\192.168.34.23\Фильмы" и посмотри вывод. Именно этот вывод и парсит скрипт, а получает функцией exec.

    У тебя же русская винда? Выложи вывод от команы dir \\192.168.34.23\Фильмы, или любой другой папки вместо Фильмы. Мне надо знать, как там идет перевод слова <dir>, чтобы сделать кросязыковый скрипт.
     
  15. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    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>
     
  16. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Вот класс, достаёт все файлы заданного компьютера.

    PHP:
    1.  
    2. <?
    3. class LanScaner {
    4.  
    5.   private $files = false;
    6.  
    7. /*
    8. Метод сканирует все расшаренные папки
    9. Возвращает их в виде массива
    10. */
    11.  
    12.   public function shared($ip) {
    13.     exec('net view '.$ip, $shared);
    14.     $shared = array_slice($shared, 7, -2);
    15.     foreach($shared as $key=>$value) {
    16.       $shared[$key] = iconv('866', 'cp1251', $value);
    17.       if(!stristr($shared[$key], '  Disk') && !stristr($shared[$key], '  Диск'))
    18.        unset($shared[$key]);
    19.       else {
    20.         $shared[$key] = str_replace(array('  Disk', '  Диск'), array('', ''), $shared[$key]);
    21.         $shared[$key] = trim($shared[$key]);
    22.         $this->scaner($ip.'\\'.$shared[$key]);
    23.       }
    24.     }
    25.     return $shared;
    26.   }
    27.  
    28. /*
    29. Метод сканирует каждую расщаренную папку.
    30. Записывает все нужные файлы в $this->files
    31. */
    32.  
    33.   public function scaner($res) {
    34.     exec('dir "\\\\'.$res.'"', $folders);
    35.     $folders = array_slice($folders, 7, -2);
    36.  
    37.     foreach($folders as $key=>$value) {
    38.       $value = iconv('866', 'cp1251', $value);
    39.       if(!strstr($value, '<DIR>')) {
    40.         $value = substr($value, 36, strlen($value));
    41.         $value = '\\\\'.$res.'\\'.$value;
    42.         $this->files[] = $value;
    43.       }
    44.       else {
    45.         $value = explode('<DIR>', $value);
    46.         $value = trim($value[1]);
    47.         $this->scaner($res.'\\'.$value);
    48.       }
    49.     }
    50.   }
    51.  
    52. /*
    53. Метод фильтрует файлы на предмет нужных.
    54. передавать массив c нужными расширениями файлов.
    55. */
    56.  
    57.   public function filter($filter) {
    58.     if($this->files == false) {
    59.       die('КОмпьютер не был сканирован.');
    60.     }
    61.     else {
    62.       $needs = array();
    63.       foreach($this->files as $value) {
    64.         $ext = explode('.', $value);
    65.         $ext = $ext[count($ext)-1];
    66.         if(in_array($ext, $filter)) {
    67.           $needs[] = $value;
    68.         }
    69.       }
    70.     }
    71.     $this->files = $needs;
    72.     return $needs;
    73.   }
    74.  
    75. /*
    76. Метод ищет среди файлов нужные.
    77. $str - строка, которую искать в каждом файле
    78. $mode - может принимать 2 значения:
    79.         1 - любое совпадение
    80.         2 - строгий отбор
    81. */
    82.  
    83.   public function search($str, $mode = 1) {
    84.     if($this->files == false) {
    85.       die('КОмпьютер не был сканирован.');
    86.     }
    87.     else {
    88.       $needs = array();
    89.       if($mode === 1) {
    90.         foreach($this->files as $value) {
    91.           if(stristr($value, $str)) {
    92.             $needs[] = $value;
    93.           }
    94.         }
    95.       }
    96.       elseif($mode === 2) {
    97.         foreach($this->files as $value) {
    98.           if($value == $str) {
    99.             $needs[] = $value;
    100.           }
    101.         }
    102.       }
    103.       else die('Передано неверное значение.');
    104.       $this->files = $needs;
    105.       return $needs;
    106.     }
    107.   }
    108.  
    109.   public function result() {
    110.     return $this->files;
    111.   }
    112. }
    113. ?>
    Использовать так:
    PHP:
    1.  
    2. <?php
    3. $lan = new LanScaner();
    4. $lan->shared('xxx.xxx.xxx.xxx'); //Вначале сканировать. Всегда обязательно вызывать этот метод самым первым. Передавать ип нужного компьютера.
    5. $lan->filter(array('avi', 'wmv', 'mpg', 'mpeg')); //Можно применить фильтр. Передавать все нужные расширения в массиве.
    6. $lan->search('Рэмбо', 1);  //Можно найти что-то среди отфильтрованных файлов.
    7. print_r($lan->result());   //Выводим всё.
    8. ?>
    9.  
    netruxa
    Класс в зачаточном состоянии, писал лишбы работало, дальше сам переделай как тебе нужно :)
     
  17. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    А я просто юзаю http://lantricks.ru/lanscope/ =)
     
  18. +Sten+

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

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Да я тоже его юзаю, несмотря что находит почему-то только каждый второй компьютер. Хочу реализовать несколько своих фич вроде карты сети и мультипоиска )

    ЗЫ: Да и просто делать нефиг, вот и пишу всякую дрянь на досуге :)
     
  19. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    +Sten+ спасибо тебе конешно большое за то что не поленился и такой код написал, но у меня не работает(( все скопировал, вставил
    PHP:
    1. $lan->shared('192.168.34.23');
    а выдает
     
  20. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    а не нормально рабит... поторопился тебя упрекать))
    убрал фильтр и поиск
    PHP:
    1. //$lan->filter(array('avi', 'wmv', 'mpg', 'mpeg')); //Можно применить фильтр. Передавать все нужные расширения в массиве.
    2.  //$lan->search('Рэмбо', 1);  //Можно найти что-то среди отфильтрованных файлов.
    и выдает нормально весь список файлов... а мне именно это и надо было...СПАСИБО ТЕБЕ БОЛЬШОЕ! теперь это все занесу в базу и сделаю поиск
     
  21. netruxa

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

    С нами с:
    24 мар 2008
    Сообщения:
    18
    Симпатии:
    0
    ааа во я лошара. намного проще дать буковку какому нить расшаренному ресурсу и мона сканировать по обычной схеме
    например - \\192.168.34.23\Фильм = w:
    PHP:
    1. $handlee = opendir('W:\\');
    2.  while (false !== ($file = readdir($handlee))) {
    3. echo '<br>'.$file;
    4.   }
    блиин во я заморочился то вначале... не подумал(