包括来自父目录或其他目录的文件

Posted

技术标签:

【中文标题】包括来自父目录或其他目录的文件【英文标题】:Include files from parent or other directory 【发布时间】:2012-02-08 05:45:00 【问题描述】:

我需要将父目录和其他子目录中的文件包含到子目录中。我以前通过简单地使用 include('/rootdirectory/file.php'); 来完成它。但现在它似乎不起作用了。

只是想知道我该怎么做,谢谢。

这是我的确切路线:

include('/forums/groups.php');

它给了我这个错误(页面仍然运行):

警告: include(/forums/groups.php) [function.include]: 失败 打开流:中没有这样的文件或目录 C:\xampp\htdocs\forums\blog\posts.php上线

警告: include() [function.include]:打开失败 '/forums/groups.php' 用于包含 (include_path='.;C:\xampp\php\PEAR') 在 C:\xampp\htdocs\forums\blog\posts.php 第 3 行

【问题讨论】:

经常遇到这个错误,要快速排除故障,请按照以下步骤操作:***.com/a/36577021/2873507 【参考方案1】:

include() 及其亲属采用文件系统路径,而不是相对于文档根目录的 Web 路径。要获取父目录,请使用../

include('../somefilein_parent.php');
include('../../somefile_2levels_up.php');

如果您以/ 开头,将使用绝对系统文件路径:

// Full absolute path...
include('/home/username/sites/project/include/config.php');

【讨论】:

试过这样做,但它对问题不起作用,因为我有同样的问题。 @ubique 如果它不能完全按照您的应用程序中发布的那样工作,那是因为您的文件系统布局可能与您的预期不同,而不是因为这是不正确的。发布有关您尝试包含的文件的信息以寻求帮助。 @ubique.. 或者您的脚本更改了当前工作目录。 getcwd() 看看它是什么。 @thanassis 你是指哪个根?文件系统根是'/',Web 服务器文档根是$_SERVER['DOCUMENT_ROOT'] . '/path/to.file.php'(在某些主机上,文档根也是 FS 根,在许多其他主机上,它类似于 htdocs/ 目录)。要访问同级目录中的文件,您需要../sibling/file.php @thanassis 在不知道您的文件系统布局的情况下,我无法猜测您失败的原因。具体来说,主文件驻留在哪个目录中,包含文件驻留在哪个目录中。当您的应用程序更改工作目录(Drupal 会这样做)时,这也可能是一个问题,然后您需要一个通过 dirname(__FILE__) . '/path/to/file.php' 的绝对路径,就像在其他解决方案中一样。【参考方案2】:

如果您的服务器没有使用

从父目录解析文件

include '../somefilein_parent.php'

试试这个(使用相对于脚本的父目录):

include __DIR__ . "/../somefilein_parent.php";

【讨论】:

当我从代码文件夹中运行脚本时,从 linux ubuntu 命令行,第一种引用方式工作正常。但是,当我在当前目录为根目录或其他文件夹时运行脚本时.. 使用 php /var/www/html/mycode/myfile.php 运行时,包含文件没有采用正确的路径。因此,您使用 DIR 引用的第二种方式解决了该问题。【参考方案3】:

这是我考虑到这个问题而写的:

<?
function absolute_include($file)
         
         /*
         $file is the file url relative to the root of your site.
         Yourdomain.com/folder/file.inc would be passed as
         "folder/file.inc"
         */

         $folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");

         if($folder_depth == false)
            $folder_depth = 1;

         include(str_repeat("../", $folder_depth - 1) . $file);
         
?>

希望对你有帮助。

【讨论】:

这看起来很有趣。如果您位于“主题”类型的子文件夹中,并且希望它成为您的绝对路径,那该怎么办?【参考方案4】:

取决于您尝试包含的文件所在的位置。

例子:

/rootdir/pages/file.php

/someotherDir/index.php

如果您在 index.php 中编写了以下内容: include('/rootdir/pages/file.php');它会出错,因为它会尝试获取:

/someotherDir/rootdir/pages/file.php哪个当然不存在……

所以你必须使用include('../rootdir/pages/file.php');

【讨论】:

我已经为这个常见错误开始了一个故障排除清单:***.com/a/36577021/2873507【参考方案5】:

通俗地说,实用性,我认为这是一个古老的 DOS 技巧/东西。哇!那是什么?操作系统?没听说过!

".." 将您退出当前子目录一次到更高的文件夹/目录,并且 .. enter 键入两次也将您退出 2更高的父文件夹。继续背靠背添加“.. enter”,您很快就会发现自己位于目录的顶层。

对于新手要更好地理解这一点,请考虑这一点(如果您知道这意味着什么,请考虑家庭 PC 或“C:\ 驱动器”,而不是 web-servers/host“根目录”)。当您使用它时,请考虑您的网站存在于您家用 PC 的硬盘驱动器上的某个位置,隐藏在 C:\ 驱动器下的某个文件夹中。最后,你可以把它想象成“..”是后一个目录,“/”是前一个目录/文件夹。

现在! 如果您使用命令提示符并且位于 PC 的“myDocuments”文件夹中,则必须退出该文件夹以通过键入“../”。 如果您想访问位于 myDocuments 文件夹中的 widows 目录中的文件,理论上您可以键入 ../windows;在 DOS 命令提示符的现实中,您只需键入 ..,但我正在为您设置网络。 / 自然地重定向到另一个目录。

使用“myDocuments”假设您在其中创建了 2 个文件夹,分别称为“PHP1”和“PHP2”,这样我们现在就有了文件夹:

C:\myDocuments\PHP1 C:\myDocuments\PHP2

在 PHP1 中放置一个名为 index.php 的文件。在 PHP2 文件夹中放置了一个名为 Found.php 的文件。现在变成:

C:\myDocuments\PHP1\index.php C:\myDocuments\PHP2\found.php

在里面 C:\myDocuments\PHP1\index.php 文件,您需要编辑并键入如下内容:

<?php include ('../php2/found.php')?>

../ 是位置性的,因此它会考虑您当前的文件位置“C:\myDocuments\PHP1\index.php”,并且是一个指令告诉它退出 PHP1目录进入或前进到PHP2目录,查找Found.php文件。但它读了吗?请参阅下面我对故障排除的想法。

现在!假设您有 1 个文件夹 PHP1 和一个子文件夹 PHP2:

C:\myDocuments\PHP1\PHP2

您只需引用/编码

<?php include('/PHP2/found.php') ?>

作为 PHP2 的子目录存在于 PHP1 目录之下或之内。

如果上述方法不起作用,则可能与 access/htaccess 或目录权限或拼写错误有关。为了增强这一点......进入故障排除......如果“found.php”文件中有错误/错别字,它会在呈现错误时崩溃,这可能是你的原因(require/require_once)体验它没有更改目录或访问文件的错觉。 最后想到这个问题,您可能需要实例化您的函数或引用,以便通过创建一个新的变量或对象(例如

$newObject = new nameobject("origianlThingy");

请记住,仅仅因为您包含/需要某些东西,有时意味着,它被包含/需要运行,但可能需要重新创建以使其处于活动状态或访问它。 New 肯定会“如果它可读”重新创建它的一个实例,并使其在当前文档中可用,同时保留原始文档。但是,您应该在所有实例中引用新创建的变量 $newObject ......如果它是全局的。

从一些网络主机帐户的角度来看;网络主机是一些超大的硬盘驱动器(就像您的 PC 上的那样),您的域只不过是他们分配给您的文件夹。您的文件夹称为根目录。在该文件夹中,您可以做任何您被允许做的事情。 您在目录/文件夹之间移动的“多种方法之一”是使用../,但要多次退出当前参考到您想要的文件夹位置找到。

在我醉酒的状态下,我意识到我知道的太多以至于无法保持清醒,而不是 快疯了!”

【讨论】:

【参考方案6】:

任何以斜杠开头的路径都是绝对路径。从服务器的根文件夹而不是文档根目录的根文件夹。您可以使用../ 进入父目录。

【讨论】:

我已经为这个常见错误开始了一个故障排除清单:***.com/a/36577021/2873507【参考方案7】:

我从 frank 那里获得灵感,并在我的“settings.php”文件中添加了类似的内容,当有链接时,该文件会包含在所有页面中:

“设置.php”

    $folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");

     $slash="";

    for ($i=1;$i<=($folder_depth-2);++$i)

        $slash= $slash."../";

    

在我的 header.php 中要包含在所有页面中:

a href= .... php echo $slash.'index.php'....

似乎它适用于本地和托管环境......

(注意:我是一个绝对的初学者)

【讨论】:

【参考方案8】:

之前有同样的问题是这样解决的:

include('/../includes/config.php'); //注意'/'出现在'../includes/config.php'之前

【讨论】:

【参考方案9】:

您可能对使用 php 的内置函数 realpath() 感兴趣。 并传递一个常量 DIR

例如: $TargetDirectory = realpath(__DIR__."/../.."); //会带你回到2个文件夹

String realpath() :: 返回规范化的绝对​​路径名..

【讨论】:

这很完美!但请确保正确使用'/'斜线以使此方法有效。谢谢【参考方案10】:

根目录(在 PHP 中)是被 ping 的文件的目录。例如,我去http://localhost/directory/to/file/index.php,根目录将是“/ditory/to/file”,因为它是您发出网络请求的那个。

【讨论】:

可以作为评论发表【参考方案11】:

我不敢相信没有一个答案指向函数 dirname()(自 PHP 4 起可用)。

基本上,它返回被引用对象的完整路径。如果您使用文件作为参考,该函数将返回文件的完整路径。如果引用的对象是一个文件夹,该函数将返回该文件夹的父文件夹。

https://www.php.net/manual/en/function.dirname.php

对于当前文件的当前文件夹,使用$current = dirname(__FILE__);

对于当前文件夹的父文件夹,只需使用$parent = dirname(__DIR__);

【讨论】:

以上是关于包括来自父目录或其他目录的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何与 ECS 上的其他容器共享文件或目录?

“致命:不是 git 存储库(或任何父目录)”来自 git status

Makefile 包含来自其他目录的头文件

Linux终端里除了cd命令,其他命令都报没有那个文件或目录

HDFS权限管理

linux之文件查看,操作