Вы не зашли.
    
        
        
                Добавил 
#48.
Думаю так попроще будет.
        
        
                
    
 
        
        
                УРА!!!

Код:
| span style="color: #0000BB"><?phpfunction dread($parent) {    $array = array();    if (false !== ($resource = opendir($parent))) {        while (false !== ($name = readdir($resource))) {            if ('.' != $name && '..' != $name) {                $child = $parent . DIRECTORY_SEPARATOR . $name;                $array[] = $child;                if (is_dir($child)) {                    $array = array_merge($array, dread($child));                }            }        }        closedir($resource);    }    return $array;}// Get physical pathes$root = realpath('files');$physical = dread($root);if (! empty($physical)) {    // Get virtual pathes    $virtual = array();    $pdo = new Pdo('mysql:dbname=downloads;host=127.0.0.1;', 'root', '');    $qt = 'SELECT `id`, `path` FROM `downloads`;';    if (false !== ($q = $pdo->query($qt))) {        if ($q->rowCount()) {            while ($path = $q->fetch(PDO::FETCH_ASSOC)) {                $virtual[$path['id']] = $path['path'];            }        }    }    // Search new pathes    $new = empty($virtual) ? $physical : array_diff($physical, $virtual);    // Search invalid pathes    // $invalid = array_diff($virtual, $physical);    if (! empty($new)) {        // Add new pathes on virtual        $qt = 'INSERT INTO `downloads` (`path`, `name`, `type`, `parent_id`, `size`) '            . 'VALUES (:path, :name, :type, :parent_id, :size);';        $pdo->beginTransaction();        $q = $pdo->prepare($qt);        $parentId = null;        foreach ($new as $path) {            if (false !== $q->execute(array(                ':path'      => $path,                ':name'      => basename($path),                ':type'      => ($type = filetype($path)),                ':parent_id' => (int) array_search(dirname($path), $virtual),                ':size'      => ('file' == $type ? filesize($path) : 0)            ))) {                $parentId += (null === $parentId) ? $pdo->lastInsertId('downloads') : 1;                if ('dir' == $type) {                    // $virtual[$pdo->lastInsertId('downloads.id')] = $path;                    $virtual[$parentId] = $path;                }            }        }        $pdo->commit();    }} | 
 
        
        
                Я еще думал может ключи и значения после
отсеивания array_diff() местами поменять,
чтоб по ключу можно было получить parent_id,
чем искать array_search()?
        
        
                
    
 
        
        
                Вот, заоптимизировал, вроде. Хотя кто знает, может простым: $pdo->lastInsertId('downloads') было бы куда быстрее.
Пост 
#52
        
        
                
     
        
        
                Насчет физически несуществующих файлов, можно в принципе оставить эти записи.
Просто, если человек наткнется, то проверить один раз на существование файла/папки, если нет, то удалить все вложенные папки/файлы.
        
                            
                Отредактировано tipsun (2013.02.01 18:06)
            
        
                
     
        
        
                Если код плохой, есть еще одна мысль.
Получить сначала виртуальные данные, потом при проверке физических данных сразу все фиксировать.
        
        
                
    
 
        
        
        
                Чтобы получилась кнопка [ .. ]
После в отдельную переменную и долой с массива.
        
        
                
    
 
        
        
                Я, наверно, нативным синтаксисом в шаблонах, на CodeIgniter попробую все написать.
        
        
                
    
 
        
        
                Есть желающие присоединиться к написанию?
Если да, то я на code.google.com выложу.