【问题标题】:PHP file_exists($var) not workingPHP file_exists($var) 不工作
【发布时间】:2011-09-03 23:31:59
【问题描述】:

我正在尝试在我的笔记本上编写一些代码,并且正在使用 xampp 环境。我有以下代码:

class A {
...
  foreach ($blocks as $block) {
    $block = 'dir/dir2/' . $block;
  }
  if (file_exists($block) == true) {
    $var .= file_get_contents($block);
  }
}

当我在 foreach 循环中回显 $block 变量时,它会返回文件的路径。但是,file_exists 函数总是返回 false。你能帮我弄清楚这里出了什么问题吗?

【问题讨论】:

    标签: php file-io


    【解决方案1】:

    在 php file_exists 手册页上引用某人的评论,

    注意:如果您传递相对路径 到 file_exists,它将返回 false 除非路径恰好是相对的 到“当前 PHP 目录”(参见 chdir() )。

    换句话说,如果你的路径是相对于当前文件目录的,你应该将dirname(__FILE__)附加到你的相对路径中,或者从PHP 5.3开始,你可以只使用__DIR__

    【讨论】:

    • TJM,如果我添加 DIR,回显给我 "C:\xampp\htdocs/dir/dir2" 并且 file_exists 仍然不起作用。
    • @Alex 你混合了 unix 和 windows 风格的路径,使用 `dir\dir2` 代替
    • 啊,是的,我假设 linux 基于你的路径,正如 onteria_ 所说,改变你的路径分隔符应该可以解决它。
    • 谢谢。很抱歉提出一个完全愚蠢的问题,但是最好的方法是什么,这样我在服务器上部署代码时就不必重写斜杠了?
    • @jeremysawesome @Alex DIRECTORY_SEPARATOR 常量
    【解决方案2】:

    据我所知,您在foreach 循环之外使用file_exists。因此,$block 变量当时没有被绑定。

    编辑:实际上它仍然绑定到您集合中的最后一个值。

    【讨论】:

    • It is bound,但它保存了循环中最后一次迭代的值。这个项目恰好不存在,所以看起来file_exists“always”返回false。
    • 谢谢,Tomalak,它确实拥有最后的价值!
    • TJM,如果我添加 DIR,回显会给我“C:\xampp\htdocs/dir/dir2”,而 file_exists 仍然不起作用。
    • @Alex:那么路径不存在。由于您混合了斜线,这并不奇怪。
    • 谢谢,托马拉克。试图弄清楚如何在调用 DIR 时更改斜杠,而无需在我在线部署代码时重新编码所有内容。
    【解决方案3】:

    您打算在 foreach 循环中检查file_exists() 吗?

    class A {
      ...
      foreach ($blocks as $block) {
        $block = 'dir/dir2/' . $block;
    
        // Inside the loop      
        if (file_exists($block) == true) {
          $var .= file_get_contents($block);
        }
      }
    }
    

    【讨论】:

    • 是的,迈克尔。就是这样。
    【解决方案4】:

    file_exists 目的是检查提供的文件是否存在。它返回错误。这意味着您的文件在 php 查找的位置不存在。 php 可能正在寻找与您预期不同的区域。看起来是时候进行一些调试了。

    运行这个来找出 php 在哪里寻找。

    echo "current working directory is -> ". getcwd();
    

    那是你想让 php 看的地方吗?如果没有,则使用 chdir 函数更改 php 正在查找的目录。

    $searchdirectory = "c:\path\to\your\directory"; //use unix style paths if necessary
    chdir($searchdirectory);
    

    然后运行你的函数(注意:为了与 windows 样式路径保持一致,我将斜杠翻转为反斜杠。)

    class A {
    ...
      //change working directory
      $searchdirectory = "c:\path\to\your\directory"; //use unix style paths if necessary
      chdir($searchdirectory);
    
      foreach ($blocks as $block) {
        $block = 'dir\dir2\' . $block;
    
        if (file_exists($block) == true) {
          $var .= file_get_contents($block);
        }
      }
    }
    

    【讨论】:

      【解决方案5】:

      我猜file_exists 的检查工作与使用file_get_contents 打开有点不同。所以我可能是这些问题之一:

      • file_exists:如果由于安全模式限制而无法访问,则返回 FALSE
      • file_exists:用于检查它使用的是真实的 UID/GID,而不是有效的权限
      • file_get_contents:使用的协议与 file_exists 不知道..

      也许它可以帮助你进一步!祝你好运

      【讨论】:

        【解决方案6】:

        这可能为时已晚,但在过去 2 小时撞了我的头后才找到解决方案。如果您使用的是 Windows,它默认隐藏文件扩展名。所以 a.txt 将显示为 a ,而显示为 a.txt 的文件实际上是 a.txt.txt 。要查看文件扩展名,请转到 控制面板 -> 外观和个性化 -> 文件夹选项 -> 视图
        并取消选中隐藏文件扩展名。现在您可以看到要在 file_exists() 中使用的真实名称。

        【讨论】:

          【解决方案7】:

          你在混合斜线,这个把我逼疯了。

          解决办法如下:

          echo getcwd();
          $searchimg = getcwd().'\\public\\images\\pics\\'.$value['name'].'.'.$value['ext'];
          

          你需要一直引用这样的斜线到图片:)

          【讨论】:

            【解决方案8】:

            如果您对文件使用变量,请确保末尾没有空格。我疯了,直到找到解决方案:用 trim() 删除空白。见下文。

            if file_exists(trim($Filename))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-11-21
              • 2014-05-15
              • 2013-12-21
              • 2017-05-14
              • 2017-03-11
              • 2013-04-21
              • 1970-01-01
              • 2011-11-05
              相关资源
              最近更新 更多