Скрытые каталоги PHP — Windows

Я пытаюсь добавить в нашу интрасеть функцию, которая позволит пользователям входить в интрасеть и получать доступ к документам, хранящимся в сети SAN Windows.

На данный момент я успешно получил все имена файлов и папок в «Моих документах» указанных пользователей.

У меня возникают трудности с удалением скрытых файлов и папок из массива. На данный момент я могу удалить все папки и файлы, начинающиеся с ..

Однако в Windows они помечаются как «скрытые» в свойствах. Я погуглил и нашел много ресурсов о том, как пометить файл как скрытый и как скрыть файлы, начинающиеся с ., но ни один о том, как удалить скрытые файлы / папки Windows. В одном сообщении на stackoverflow упоминается об использовании DirectoryIterator, но на данный момент, но вообще не объясняется, как его использовать, чтобы проверить, помечены ли файлы как скрытые.

У нас более 1000 пользователей, примерно 500 МБ - 1 ГБ документов, с несколькими уровнями каталогов, поэтому он должен быть относительно быстрым.

Для пояснения: как во время рекурсивной итерации в системе Windows узнать, скрыт каталог или нет, не полагаясь на предваряемый символ .?


person Phil Cross    schedule 10.03.2014    source источник


Ответы (1)


Итак, получилось, с помощью функции exec(), так что используйте с осторожностью! Я использую CodeIgniter, поэтому я немного изменил функцию directory_helper.php, так как она установлена ​​в окне Windows, ей всегда нужно проверять наличие скрытых файлов, но она также должна работать для сайтов без codeigniter:

function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE)
{
    if ($fp = @opendir($source_dir))
    {
        if(!$hidden)
        {
            $exclude = array();
            exec('dir "' . $source_dir . '" /ah /B', $exclude);
        }

        $filedata   = array();
        $new_depth  = $directory_depth - 1;
        $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;

        while (FALSE !== ($file = readdir($fp)))
        {
            // Remove '.', '..', and hidden files [optional]
            if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.') OR ($hidden === FALSE && in_array($file, $exclude)))
            {
                continue;
            }

            if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file))
            {
                $filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden);
            }
            else
            {
                $filedata[] = $file;
            }
        }

        closedir($fp);
        return $filedata;
    }

    return FALSE;
}

Это просканировало 2207 файлов и 446 папок примерно за 11 секунд (я знаю возрасты, но лучшее, что я мог сделать). Протестировал на 500 папках и 200 файлах и сделал это примерно за 3 секунды.

Это рекурсивная функция, которая будет сканировать каждый нескрытый каталог. Первое, что он делает, это сканирует текущий каталог на наличие всех скрытых файлов и папок, используя функцию exec('dir *directory* /ah /B').

Затем он сохранит результаты в массиве и убедится, что текущий читаемый файл/каталог не находится в этом массиве.

person Phil Cross    schedule 10.03.2014