Jump to content

Archived

This topic is now archived and is closed to further replies.

fhumayun

Directory Details Code

Recommended Posts

I've been trying consolidate some code recipes for getting PHP to recursively walk a (windows UNC or *Nix) directory path and collect all the file details into an array (which I will later flatten and perform parsing, and file operations like moving and ftp'ing)

The problem I'm having here so far:
[blockquote]1) I can't seem to figure out why the looping halts abruptly, therefore only producing one result.
2) The problem aforementioned may relate, but I don't understand, why my time-difference determination is not working correctly.[/blockquote]
I'm really hoping to have some expert eyes point to any mistakes I'm not seeing.
Many thanks,

[code]<?php
// Include some vanity related functions
require_once 'function.size_readable.php';
// Set maximum execution time for recursion results
set_time_limit(900);


//-------------------------------------------------------------------------------------------------
//          Function to recursively scan and collect details about files it finds in folders
//-------------------------------------------------------------------------------------------------     
function rec_scandir($dir)
{  
   //$files = array();  // declaring arrays
   //$files_processed = array();
   if ( $handle =opendir($dir) ) {   // check if folder is valid
       while ( ($file =readdir($handle)) !=false ) {  // loop while walking directory
           if ( $file !=".." && $file !=".") {   // skip folders ..  and .
               if ( is_dir($dir . "/" . $file) ) {
                   $files_processed[$file] =rec_scandir($dir . "\\" . $file); // list directory
               }else {  // Listing file details
                        // Changed $file into an array with more information about the files
                         $files = array("name" => $file,
                                       "path" => $dir . "\\" .$file,
                                       //"size" => filesize($dir . "/" . $file),
                                       "friendly_size" => size_readable(filesize($dir . "/" . $file), 'MB', '%01.2f %s'),  
                                       "type" => filetype($dir . "/" . $file),
                                       "last_change" => $last_change = date("F d Y h:i:s", filemtime($dir . "/" . $file)),                                    
                                       );
                                        
                        //
                        //          Perform File Age check
                        //                    
                            $contents = $last_change; // contents of date collected in array
                            $delimiter = " ";  // define the delimiter
                            $splitcontents = explode($delimiter, $contents);  // php parsing function
                            $regDate=strtotime($contents); //grab date contents
                                    
                            //caluculate our time from GMT time
                            $hour=gmdate('H');
                            $min=gmdate('i');
                            $sec=gmdate('s');
                            $month=gmdate('n');
                            $day=gmdate('d');
                            $year=gmdate('Y');
                            $stamp=mktime ($hour,$min,$sec,$month,$day,$year);
                            $server_time= date("F d Y h:i:s", mktime($hour,$min,$sec,$month,$day,$year));
                                                        
                            $datediff = $stamp - $regDate;  // difference calculated in seconds
                            
                            // Time measurments
                            if($datediff < 3600 )  
// if time is less than an hour (60 minutes) report minutes
                            {
                                $age = $on = floor($datediff/60). ' minute(s)';  
                            }
                            else if($datediff < 86400 )
// if time is less than an day (24 hours) then report hours
                            {
                                $age = $on =  floor($datediff/60/60).' hour(s)';
                            }
                            else if($datediff < 604800 )
// if time is less than an week (7days)report days
                            {
                                $age = $on =  floor($datediff/60/60/24). ' day(s)';
                            }
                            else if($datediff < 2419200 )
// if time is less than a month (4 weeks) report weeks
                            {
                                $age = $on =  floor($datediff/60/60/24/7). ' week(s)';
                            }
                            else if($datediff < 29030400)
// if time is less than a year (12 months) report months
                            {
                                $age = $on =  floor($datediff/60/60/24/7/4). ' month(s)';
                            }
                            else // go ahead and report year(s)
                            {
                                $age = $on =  floor($datediff/365/60/60/24). ' year(s)';
                            }                
                                            
                        
                        //this second array that has the age of file calculated from last_change variable in previous array
                        $process_age = array("age" => $age,
                                             "server_time" => $server_time);
                        
                        // merging results of second array with first
                        $files_processed = array_merge($files,
                                             $process_age
                                            );
               }
           }          
       }
       closedir($handle);  // closing out folder
       return $files_processed;
   }
}

function cmp($a, $b)
{
   if ( is_string($a) && is_string($b) ) {
       return strcmp($a, $b) > 0 ? 1 : -1;
   }elseif ( is_int($a) && is_int($b) ) {
       return $a > $b ? 1 : -1;
   }elseif ( is_int($a) && is_string($b) ) {
       return 1;
   }elseif ( is_string($a) && is_int($b) ) {
       return -1;
   }else {
       return 0;
   }
}

function array_ukmultisort(&$arr, $func) {
   uksort($arr, $func);
   while ( list($key, $val) =each($arr) ) {
       if ( is_array($val) ) {
           array_ukmultisort($arr[$key], $func);
       }
   }
}

function get_size($path)  {
       if(!is_dir($path))return filesize($path);
       $dir = opendir($path);
       while($file = readdir($dir))
       {
           if(is_file($path."/".$file))$size+=filesize($path."/".$file);
           if(is_dir($path."/".$file) && $file!="." && $file !="..")$size +=get_size($path."/".$file);
          
       }
       return $size;
}

function mostRecentModifiedFileTime($dirName,$doRecursive) {
   $d = dir($dirName);
   $lastModified = 0;
   while($entry = $d->read()) {
       if ($entry != "." && $entry != "..") {
           if (!is_dir($dirName."/".$entry)) {
               $currentModified = filemtime($dirName."/".$entry);
           } else if ($doRecursive && is_dir($dirName."/".$entry)) {
               $currentModified = mostRecentModifiedFileTime($dirName."/".$entry,true);
           }
           if ($currentModified > $lastModified){
               $lastModified = $currentModified;
           }
       }
   }
   $d->close();
   return $lastModified;
}

// specify directory to monitor
//$pdir = "\\\\tapedrive\\c\\To_Be_Processed";

// perform recursive display details on parent folder
$dir =rec_scandir($pdir);
$flatten_array =natural_list($dir);

// collect details into a multidimensional array
array_ukmultisort($dir, "cmp");

/* selective display function
function week_old($dir_basket) {
    return ($dir_basket['last_change'] <
*/

// aim to browser
echo "<pre>";
echo $pdir . " Folder Size: ".size_readable(get_size($pdir), 'MB', '%01.1f %s')."\n";
//print_r($flatten_array);
print_r($dir);
echo "</pre>";
?>[/code]

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.