PHP mkdir - 抛出错误“文件存在”

时间:2012-12-13 12:16:18

标签: php mkdir rmdir

我目前正在使用raywenderlich.com团队的 iOS6 By Tutorials的 Passbook 部分,我的PHP中出现以下错误:

  

警告:mkdir()[function.mkdir]:文件存在于第26行的/xxx/xxx/xxx/xxx/Pass.php中

     

警告:mkdir()[function.mkdir]:文件存在于第26行的/xxx/xxx/xxx/xxx/Pass.php中

     

警告:rmdir(/ tmp / 50c8d11c60538 / ..)[function.rmdir]:第54行的/xxx/xxx/xxx/xxx/Pass.php中的目录不为空

我班上的代码如下:

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();
    }
}

我正在实例化一个实例:

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

我已尝试上传随本书提供的示例代码并获得相同的错误。

我已经在相关论坛上发布了这个帖子,但是还没有人回复,并希望在继续之前了解这一点。

谢谢, 尼克

3 个答案:

答案 0 :(得分:0)

你的第一次测试'。'和'..'但它会是假的,然后转到其他地方。和'。'和'..'是目录。因此它尝试创建一个名为“。”的目录,该目录已经存在。

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));
        }

通过执行此操作进行修复:

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));
            }

答案 1 :(得分:0)

非常感谢迈克尔,但这不起作用 - 抛出同样的错误。

感谢你,我已经解决了我的问题。

在else is语句中,我再次检查它不是目录:

else if (is_dir($name) && substr($fileObject->getFileName(), 0, 1) != ".")

至于删除目录错误,我只需要添加一个额外的方法,我会在其中发送消息,检查目录是否为空,然后再尝试删除它。

非常感谢, 尼克

答案 2 :(得分:-4)

我希望这个帮助你在mkdir面前添加一个“@”符号,所以它看起来像这样:

@mkdir($this->workFolder."/".str_replace($path."/", "",$name));