[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 305
  • Last Modified:

delete folder/contents based on date

I have a test environment where I create a group of sub folders within a parent folder.
Each of the sub-folders has a number of documents in each.

ie.
Parent Folder
    Subfolder A
          file1
          file2
    Subfolder B
          file1

I want to create a cron task that will run a script which will remove any subdirectory that is 2 days old.

My challenge is to cycle thru all contents of parentfolder, examine the date of each folder and if the date is older than 2 day delete the contents that folder and then the folder itself.

I don't know the names of the folders in advance

If I use code such as
readdir($parentFolder)
who do I tell if the item is a folder or a file

This script doesn't need to be recursive, as there are not folders within subFolders
0
joomla
Asked:
joomla
  • 7
  • 6
1 Solution
 
TvMptCommented:
You can use a simple php page to do that.

Use the stat() to get date info

Exemple_:
$stat = stat('\path\to\directory');
echo 'Modification time: ' . $stat['mtime']; // will show unix time stamp.

Open in new window



Modifiy the script to compare the mtime with current time minus 2 days...

/**
* Delete a file/recursively delete a directory
*
* NOTE: Be very careful with the path you pass to this!
*
* @param string $path The path to the file/directory to delete
* @return void
*/
function delete_recursive($path)
{
    if (is_dir($path))
    {
        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::CHILD_FIRST
        );
 
        foreach ($iterator as $file)
        {
            if ($file->isDir())
            {
                rmdir($file->getPathname());
            }
            else
            {
                unlink($file->getPathname());
            }
        }
 
        rmdir($path);
    }
    else
    {
        unlink($path);
    }
}

Open in new window

0
 
joomlaAuthor Commented:
Hi,
thanks for your follow up and help
I'm not familiar with the RecursiveIteratorIterator class

With slight modification for variable names I get the following error
Fatal error: Undefined class constant 'SKIP_DOTS'

Do I need to declare anything before using the class ?
regards
M
0
 
TvMptCommented:
Try to include php_fileinfo.dll as an extension in php.ini
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
joomlaAuthor Commented:
forgive me for not knowing but is this a windows solution ?
0
 
TvMptCommented:
Its not about SO. But did you have PHP version 5.3.x ??
0
 
TvMptCommented:
This is supported starting with PHP 5.3.
0
 
joomlaAuthor Commented:
Sorry
Using 5.2.11
0
 
TvMptCommented:
You can try to use only the
new RecursiveIteratorIterator(new RecursiveDirectoryIterator($startpath), RecursiveIteratorIterator::CHILD_FIRST)
0
 
joomlaAuthor Commented:
thanks for the advice
that works to a large degree

however, it does two things that I hadn't wanted
1. it deletes files in the parentFolder.... I only want to delete subFolders
2. it deletes the parentFolder as well

So, if I call the function    
delete_recursive($parentFolder);
everthing, including the parentFolder is deleted

thanks
m
0
 
TvMptCommented:
Just put a simple if to skip base path...
0
 
joomlaAuthor Commented:
I'm sorry, but how do it apply an if statement to check for the base path
I'm not familiar with this class
0
 
TvMptCommented:
Try to ignore the self remove path

function delete_recursive($path)
{
    if (is_dir($path))
    {
        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::CHILD_FIRST
        );
 
        foreach ($iterator as $file)
        {
            if ($file->isDir())
            {
                rmdir($file->getPathname());
            }
            else
            {
                unlink($file->getPathname());
            }
        }

    }
}

Open in new window

0
 
joomlaAuthor Commented:
thanks for help
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 7
  • 6
Tackle projects and never again get stuck behind a technical roadblock.
Join Now