PHP mkdir - throwing error "File exists"

10,365

Your first if tests for '.' and '..' but it will be false and go to the else. And '.' and '..' are directories. So it tries to create a directory called '.', Which already exists.

if (is_file($name) && substr($fileObject->getFileName(), 0, 1) != ".")
        {
            copy($name, $this->workFolder."/".str_replace($path."/", "",$name));
        }
        else if (is_dir($name))
        {
            mkdir($this->workFolder."/".str_replace($path."/", "",$name));
        }

Fix by doing this:

if($name == '.' || $name == '..'){// ignore '.' and '..', but not hidden files
continue;
}
if (is_file($name))
            {
                copy($name, $this->workFolder."/".str_replace($path."/", "",$name));
            }
            else if (is_dir($name))
            {
                mkdir($this->workFolder."/".str_replace($path."/", "",$name));
            }
Share:
10,365
Nick
Author by

Nick

Currently a Junior Developer at Digital Dog Software, primarily developing apps for iOS, as well as some PHP work (trying to get to grips with the Laravel framework).

Updated on June 25, 2022

Comments

  • Nick
    Nick about 2 years

    I am currently working through the Passbook section of iOS6 By Tutorials by the team at raywenderlich.com, and am getting the following errors in my PHP:

    Warning: mkdir() [function.mkdir]: File exists in /xxx/xxx/xxx/xxx/Pass.php on line 26

    Warning: mkdir() [function.mkdir]: File exists in /xxx/xxx/xxx/xxx/Pass.php on line 26

    Warning: rmdir(/tmp/50c8d11c60538/..) [function.rmdir]: Directory not empty in /xxx/xxx/xxx/xxx/Pass.php on line 54

    The code in my class for this is as follows:

    class Pass
    {
        private $workFolder = null;
        private $ID = null;
    
        var $content = null;
        var $passBundleFile = null;
    
        private function copySourceFolderFilesToWorkFolder($path)
        {
            // recurse over the contents and copy files
            $files = new RecursiveIteratorIterator(
                            new RecursiveDirectoryIterator($path),
                            RecursiveIteratorIterator::SELF_FIRST);
    
            foreach ($files as $name => $fileObject)
            {
                if (is_file($name) && substr($fileObject->getFileName(), 0, 1) != ".")
                {
                    copy($name, $this->workFolder."/".str_replace($path."/", "",$name));
                }
                else if (is_dir($name))
                {
                    mkdir($this->workFolder."/".str_replace($path."/", "",$name));
                }
            }
        }
    
        // delete all auto-generated files in the temp folder
        function cleanup()
        {
            // recurse over conrents and delete files
            $files = new RecursiveIteratorIterator(
                            new RecursiveDirectoryIterator($this->workFolder),
                            RecursiveIteratorIterator::CHILD_FIRST);
    
            foreach ($files as $name => $fileObject)
            {
                if (is_file($name))
                {
                    unlink($name);
                }
                else if (is_dir($name))
                {
                    rmdir($name);
                }
            }
    
            rmdir($this->workFolder);
        }
    
        function __construct($path)
        {
            assert(file_exists($path."/pass.json"));
    
            $this->ID = uniqid();
    
            $this->workFolder = sys_get_temp_dir()."/".$this->ID;
            mkdir($this->workFolder);
            assert(file_exists($this->workFolder));
    
            $this->copySourceFolderFilesToWorkFolder($path);
    
            $this->readPassFromJSONFile($this->workFolder."/pass.json");
        }
    
        // cleanup the temp folder on object destruction
        function __destruct()
        {
            $this->cleanup();
        }
    }
    

    And am instantiating an instance with:

    $coupon = new Pass("pass/source");
    

    I have tried uploading the sample code supplied with the book and get the same errors.

    I have posted this on the relevant forum, however no one has replied as yet, and would like to get to the bottom of this before moving on.

    Thanks, Nick