【问题标题】:PHP mkdir - throwing error "File exists"PHP mkdir - 抛出错误“文件存在”
【发布时间】:2012-12-01 07:59:46
【问题描述】:

我目前正在研究 raywenderlich.com 团队的 iOS6 教程中的 Passbook 部分,并且在我的 PHP 中遇到以下错误:

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

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

警告: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");

我已尝试上传随本书提供的示例代码,但遇到了同样的错误。

我已经在相关论坛上发布了这个,但是还没有人回复,并且想在继续之前深入了解这个。

谢谢, 尼克

【问题讨论】:

  • 我认为应该有else if (!is_dir($name)),因为你有错误是因为你已经有一个同名的目录

标签: php mkdir rmdir


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    非常感谢 Michael,但是这没有用 - 抛出了同样的错误。

    多亏了你,我已经解决了我的问题。

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

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

    至于删除目录错误,我只需要添加一个额外的方法来发送消息,在尝试删除之前检查目录是否为空。

    非常感谢, 尼克

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2020-09-04
        • 2016-09-26
        • 1970-01-01
        • 2011-05-04
        • 2017-03-20
        • 1970-01-01
        相关资源
        最近更新 更多