PHP: список файлов в каталоге и подкаталогах в файл XML - PullRequest
1 голос
/ 24 апреля 2020

[РЕДАКТИРОВАТЬ: исправлены опечатки и обновлен скрипт]

Здравствуйте,

Я пытаюсь перечислить файлы, хранящиеся на удаленном сервере, и сохранить этот список в файле XML, который будет использоваться в программе обновления программного обеспечения. Для этого я написал рекурсивную функцию, которая для каждого файла вызывает другую функцию, которая записывает всю необходимую информацию (имя файла, md5 ha sh и путь).

Однако, похоже, что он перечисляет только первый набор подкаталогов, когда мне нужна функция для go в нижней части дерева файлов.

Вот код, который я использую, если кто-то может сказать мне, что мне не хватает?

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

function writeXml($pathInfo)
{
    if(!file_exists("file_listing.xml"))
            {
                //XML creation
                $dom = new DomDocument("1.0", "ISO-8859-15");
                $dom->preserveWhiteSpace = false;
                $dom->formatOutput = true;

                $root = $dom->createElement("FileList");
                $dom->appendChild($root);

                echo "Treating ".$pathInfo['basename']." in ".$pathInfo['dirname']."<br>";
                $xmlNodeFile = $dom->createElement("Name");
                $xmlNodeFileText = $dom->createTextNode($pathInfo['basename']);
                $root->appendChild($xmlNodeFile);
                $xmlNodeFile->appendChild($xmlNodeFileText);

                $xmlPath = $dom->createElement("Path");
                $xmlPathText = $dom->createTextNode($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
                $xmlNodeFile->appendChild($xmlPath);
                $xmlPath->appendChild($xmlPathText);
                echo "----Directory : ".$pathInfo['dirname']."<br>";

                $xmlMd5 = $dom->createElement("MD5");
                $fileMd5 = md5_file($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
                $xmlMd5Text = $dom->createTextNode($fileMd5);
                $xmlNodeFile->appendChild($xmlMd5);
                $xmlMd5->appendChild($xmlMd5Text);
                echo "----MD5 : ".$fileMd5."<br>";

                $xmlSha1 = $dom->createElement("SHA1");
                $fileSha1 = sha1_file($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
                $xmlSha1Text = $dom->createTextNode($fileSha1);
                $xmlNodeFile->appendChild($xmlSha1);
                $xmlSha1->appendChild($xmlSha1Text);
                echo "----SHA1 : ".$fileSha1."<br>";

                $dom->save('file_listing.xml');
                echo $pathInfo['basename']." written. <br><br>";
            }
            elseif(file_exists("file_listing.xml"))
            {
                //XML loading
                $dom = new DomDocument();
                $dom->preserveWhiteSpace = false;
                $dom->formatOutput = true;
                $dom->load("file_listing.xml", LIBXML_PARSEHUGE);

                $root = $dom->documentElement;

                echo "Treating ".$pathInfo['basename']." in ".$pathInfo['dirname']."<br>";
                $xmlNodeFile = $dom->createElement("Name");
                $xmlNodeFileText = $dom->createTextNode($pathInfo['basename']);
                $root->appendChild($xmlNodeFile);
                $xmlNodeFile->appendChild($xmlNodeFileText);

                $xmlPath = $dom->createElement("Path");
                $xmlPathText = $dom->createTextNode($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
                $xmlNodeFile->appendChild($xmlPath);
                $xmlPath->appendChild($xmlPathText);
                echo "----Directory : ".$pathInfo['dirname']."<br>";

                $xmlMd5 = $dom->createElement("MD5");
                $fileMd5 = md5_file($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
                $xmlMd5Text = $dom->createTextNode($fileMd5);
                $xmlNodeFile->appendChild($xmlMd5);
                $xmlMd5->appendChild($xmlMd5Text);
                echo "----MD5 : ".$fileMd5."<br>";

                $xmlSha1 = $dom->createElement("SHA1");
                $fileSha1 = sha1_file($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
                $xmlSha1Text = $dom->createTextNode($fileSha1);
                $xmlNodeFile->appendChild($xmlSha1);
                $xmlSha1->appendChild($xmlSha1Text);
                echo "----SHA1 : ".$fileSha1."<br>";

                $dom->save('file_listing.xml');
                echo $pathInfo['basename']." written. <br><br>";
            }

} //endof writeXml function


function scanRecursToXml($dirToScan = '.') //scandir recursive function
{
    //echo "Reading in ".$dirToScan.DIRECTORY_SEPARATOR."<br>";

    $dir = opendir($dirToScan);

    while(false !== ($file = readdir($dir)))
    {   
        //Skip '.' and '..'
        if($file == '.' || $file == '..')
        {
            continue;
        }

        $followUp = $dirToScan.DIRECTORY_SEPARATOR.$file;

        if(!is_dir($file) && $file != 'index.php' && $file !='file_listing.php' && $file !='file_listing.xml')
        {
            echo "Listing ".$file." in ".$dirToScan."<br>";

            $filePathInfos = realpath($followUp);
            writeXml(pathinfo($filePathInfos));        

        }
        elseif (is_dir($followUp))
        {
                scanRecursToXml($followUp);
        }

    }
    closedir($dir);
}   //endof scanRecurs function

//We start the process with a scanRecurs()
$localDir = '.';
scanRecursToXml($localDir);

//In the end, we check the presence of the XML file
if(file_exists('file_listing.xml'))
{
    echo "Done";
}
else
{
    echo "Something went wrong :s";
}

?>

Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2020

Я убрал много кода, когда вы повторяли некоторые вещи, я также уменьшил его, чтобы документ создавался / открывался на первом уровне функции scanRecurs ...

function writeXml(&$node, $pathInfo)
{
    $dom = $node->ownerDocument;
    $file = $dom->createElement("File");
    $node->appendChild($file);

//     echo "Treating ".$pathInfo['basename']." in ".$pathInfo['dirname']."<br>";
    $xmlNodeFile = $dom->createElement("Name", $pathInfo['basename']);
    $file->appendCHild($xmlNodeFile);

    $xmlPath = $dom->createElement("Path", $pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
    $file->appendChild($xmlPath);
//     echo "----Directory : ".$pathInfo['dirname']."<br>";

    $fileMd5 = md5_file($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
    $xmlMd5 = $dom->createElement("MD5", $fileMd5);
    $file->appendChild($xmlMd5);
//     echo "----MD5 : ".$fileMd5."<br>";

    $fileSha1 = sha1_file($pathInfo['dirname'].DIRECTORY_SEPARATOR.$pathInfo['basename']);
    $xmlSha1 = $dom->createElement("SHA1", $fileSha1);
    $file->appendChild($xmlSha1);
//     echo "----SHA1 : ".$fileSha1."<br>";

} //endof writeXml function


function scanRecursToXml($dirToScan = '.', $rootNode = null) //scandir recursive function
{
    $newFile = false;
    if ( $rootNode == null )
    {
        $newFile = true;
        $dom = new DomDocument();
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        if(!file_exists("file_listing.xml"))
        {
            //XML creation
            $rootNode = $dom->createElement("FileList");
            $dom->appendChild($rootNode);
            echo "Creating".PHP_EOL;
        }
        else    {
            //XML loading
            $dom->load("file_listing.xml", LIBXML_PARSEHUGE);
            $rootNode = $dom->documentElement;
            echo "Loading".PHP_EOL;
        }
    }
    $dir = opendir($dirToScan);
    while(false !== ($file = readdir($dir)))
    {
        //Skip '.' and '..'
        if($file == '.' || $file == '..')
        {
            continue;
        }

        $followUp = $dirToScan.DIRECTORY_SEPARATOR.$file;

        echo $followUp.PHP_EOL;
        if(!is_dir($followUp) && $followUp != 'index.php' && $followUp !='file_listing.php' && $followUp !='file_listing.xml')
        {
            echo "Listing ".$followUp." in ".$dirToScan."<br>";

            $filePathInfos = realpath($followUp);
            writeXml($rootNode, pathinfo($filePathInfos));

        }
        elseif (is_dir($followUp))
        {
            scanRecursToXml($followUp, $rootNode);
        }

    }
    closedir($dir);
    if ( $newFile )    {
        echo "Saving";
        $dom->save('file_listing.xml');
    }
}   //endof scanRecurs function

//We start the process with a scanRecurs()
$localDir = '.';
scanRecursToXml($localDir);

//In the end, we check the presence of the XML file
if(file_exists('file_listing.xml'))
{
    echo "Done";
}
else
{
    echo "Something went wrong :s";
}
...