微信扫一扫打赏支持

php中相对路径和绝对路径如何使用(详解)

php中相对路径和绝对路径如何使用(详解)

一、总结

一句话总结:

1、php中好像不能像asp那样用“/”表示根目录,代之以$_SERVER['DOCUMENT_ROOT'],其它则相同:../表示向上一层。./表示当前层
2、dirname('__FILE__')和$_SERVER['DOCUMENT_ROOT']是表示根目录,这个根目录是绝对路径,但是会随着你的项目移动而变化,所以可以多用。这种绝对路径D:\software\code\phpStudy2018\PHPTutorial\WWW\github\phpTest可以少用一点。

 

1、php中用用“/”表示根目录么?

不是,php中以$_SERVER['DOCUMENT_ROOT']表示跟目录

 

2、什么符号表示当前目录(asp,jsp,php都一样)?

点加正斜杆,./表示当前层

 

3、php中如何使用$_SERVER['DOCUMENT_ROOT']做为根目录访问其它文件?

$RootDir = $_SERVER['DOCUMENT_ROOT'];  $fireDir = "$RootDir/bb/s2.txt";

 

4、php中用$_SERVER['DOCUMENT_ROOT']做为根目录的话那么是相对路径还是绝对路径?

绝对路径。 echo $_SERVER['DOCUMENT_ROOT'];。D:\software\code\phpStudy2018\PHPTutorial\WWW\github\phpTest

 

5、php中的$_SERVER是什么变量?

超全局变量

 

6、php中的超全局变量怎么写?

$符号(变量符号)加下划线加变量名的大写。$_SERVER

 

7、php中的文件引用分为哪四种?

上级引用,下级引用,同级引用和嵌套引用

 

8、php中的每种文件引用又分为哪两种?

从属引用和非从属引用

 

9、php文件引用方式中的从属引用是什么意思?

在同一个目录下的引用

 

10、php文件引用方式中的非从属引用是什么意思?

即不在同一个目录下(没有共同的父目录,只有以网站目站为父目录的情况)

 

11、dirname(__FILE__)的值和$_SERVER['DOCUMENT_ROOT']的值一样么?都表示什么?

一样,都表示为网站根目录

 

12、php中的chdir(dirname(__FILE__)); 是什么意思?

切换当前目录到根目录

 

13、php中表示根目录的方法是什么(两种)?

dirname(__FILE__)的值和$_SERVER['DOCUMENT_ROOT']

 

14、假设info.html路径是:c:/Inetpub/wwwroot/sites/blabla/info.html;假设index.html路径是:c:/Inetpub/wwwroot/index.html;在info.html加入index.html超链接的代码怎么写?

a href = "../../index.html">index.html</a

 

15、绝对路径是什么意思?

绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:/xyz/test.txt 代表了test.txt文件的绝对路径

 

16、相对路径是什么意思?

相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录)

 

17、在Servlet中,"/"代表Web应用的跟目录么?

对的

 

18、同级怎么访问?

因为同级表示的是在同一个dir下,可以直接abc.txt来访问

 

19、所有的文件路径是以dir做参照而不是文件做参照,这句话对么?

对的

 

 

二、php绝对路径与相对路径之间关系的的深入研究

1、简述

php中好像不能像asp那样用“/”表示根目录,代之以$_SERVER['DOCUMENT_ROOT'],其它则相同:../表示向上一层./表示当前层。假如现在a/b/c/s.php要调用根目录下的 /bb/s2.txt,则:

 

$RootDir = $_SERVER['DOCUMENT_ROOT']; 
$fireDir = "$RootDir/bb/s2.txt";

或者:“../../../bb/s2.txt”表示向上返回到b再向上到a再向上到根目录然后到bb下。

 

以下是实验图:

 

当前项目(project2)的绝对路径是:D:\www\php_case\Coucom_make。也就是我们当前项目的根目录root.
  
为了能更加清楚的表述不同级别的目录文件相互的引入问题,偶大胆将引用分成三种类型即:上级对下级的引用(简称上级引用,英文译为:superior to underling。简称(stou)).

下级对上级的引用(简称下级引用,英文反之便是)

平级引用或叫同级引用(英文:paratactic)。  

2、上级引用

好了,我们明确了引用类型,下面我们来看不同类型引用它们有着什么样的规则。

我们先来说说上级引用:

看我们的实验图,在图中项目下分别有aa bb ee 三个同级目录和一个index.php文件,在bb下又有cc目录,cc下又有dd目录和cc.php ccc.php两个文件,同样dd下也包含一个dd.php文件。凡是上层对下层均属上级引用.

 

例如:index.php对于所有文件的引用: 
   cc .php对dd.php的引用: 
   ee.php对dd.php的引用:

大家仔细看一下目录结构,便会发现这三种引用虽然同属于上级引用,但它们又不完全相同,我把它分成两种情况:即在上级引用中存在两种引用情况:1.从属的上级引用(类如cc.php对dd.php,,因为这两个文件同属于cc目录)2.非从属的上级引用(类如index.php对于所有文件的引用和ee.php对dd.php的引用都属于这种情况因为它们与被引用的文件并没有一个共同的父目录,在能相对于站点根目录).

从属上级引用:

对于从属上级引用

以下是在cc.php对dd.php的引用

 

require('dd/dd.php');
非从属上级引用:

对于非从属上级引用

以下是在ee.php中对cc.php的引用

 

require('../bb/cc/cc.php');

以上所说的是上级引用,下面我们来了解一下下级引用!

3、下级引用

同理下层对上层的引用都属于下级引用,同样分成从属与非从属两类,

从属下级引用

从属下级引用相对路径以它们的父目录为根目录,例如:

Ttt.php对bbff.php的引用就属于这种情况:require('../bb/cc/cc.php');

非从属的下级引用

非从属的下级引用却是以网站的根目录为准的,例如:

ccc.php对ee.php的引用: require('../../ee/ee.php');

以上是下级引用的介绍,最后我们来看一下平级引用或者叫同级引用,

4、同级引用

其实同级引用也是分为这两种情况:从属同级引与非从属同级引用

从属同级引用

从属同级引用很简单:即在同一个目录下的两个文件的引用

例如:在dd.php中引用ttt.php require('ttt.php');

非从属同级引用

非从属同级引用:即不在同一个目录下(没有共同的父目录,只有以网站目站为父目录的情况),但是级别是相同的两个文件的引用,例如: 在aa.php在引用ee.php   require('../ee/ee.php');

以上是三种类型不同情况下的引用,另外还有涉及到嵌套引用的问题

5、嵌套引用的问题

比如:

ff.php引用dd.php,而dd.php又引用的gf.php,这种情况,本来dd.php 引用gf.php属于下级引用中的非从属引用,写法是这样的:require('../../../ee/gf.php');而ff.php引用dd.php属于上级引用中的从属引用,写法是这样的:require('./cc/dd/dd.php'); 可是你会发现在ff.php中无法找到gf.php文件,那该如何写呢?我告诉你应该在dd.php中这样写:require('../ee/gf.php');只有这样写就正确了,为什么呢?因为在涉及到嵌套引用的时候被引用文件的相对路径要以最终的引用文件为准

简而言之:

其实很简单的,你用你的web根目录做根目录.不管你怎么定,你文件肯定有一个全部都要包含的文件的,比如有的较global.php,有的较common.php

假如这个文件放再根目录

 

wwwroot/global.php

里面第一行你加个chdir(dirname(__FILE__)); //切换到global.php所在目录就是跟目录

其他文件使用

 

require "../../../global.php"; 
require "aa/aa.php"; 
require "bb/bb/cc.php";

这样就行了,因为你的global.php已经把路径切换到wwwroot了,你不用像很多人那么麻烦

 

define('ROOT_PATH',dirname(__FILE__)); 
require ROOT_PATH.....

chdir(dirname(__FILE__)); 的确很好使,相对位置引入这个文件其他引入文件只要以他为基准就好了。

 

三、HTML相对路径--上级目录及下级目录的写法

1、如何表示上级目录

../表示源文件所在目录的上一级目录../../表示源文件所在目录的上上级目录,以此类推。

假设info.html路径是:c:/Inetpub/wwwroot/sites/blabla/info.html
假设index.html路径是:c:/Inetpub/wwwroot/sites/index.html
在info.html加入index.html超链接的代码应该这样写:

<a href = "../index.html">index.html</a>

 

假设info.html路径是:c:/Inetpub/wwwroot/sites/blabla/info.html
假设index.html路径是:c:/Inetpub/wwwroot/index.html
在info.html加入index.html超链接的代码应该这样写:

<a href = "../../index.html">index.html</a>

 

假设info.html路径是:c:/Inetpub/wwwroot/sites/blabla/info.html
假设index.html路径是:c:/Inetpub/wwwroot/sites/wowstory/index.html
在info.html加入index.html超链接的代码应该这样写:

<a href = "../wowstory/index.html">index.html</a>
 
 

 

2、如何表示下级目录

引用下级目录的文件,直接写下级目录文件的路径即可。

假设info.html路径是:c:/Inetpub/wwwroot/sites/blabla/info.html
假设index.html路径是:c:/Inetpub/wwwroot/sites/blabla/html/index.html
在info.html加入index.html超链接的代码应该这样写:

<a href = "html/index.html">index.html</a>

 

假设info.html路径是:c:/Inetpub/wwwroot/sites/blabla/info.html
假设index.html路径是:c:/Inetpub/wwwroot/sites/blabla/html/tutorials/index.html
在info.html加入index.html超链接的代码应该这样写:

<a href = "html/tutorials/index.html">index.html</a>

 

 

四、java(Web)中相对路径,绝对路径问题总结

前言:


 前一段时间,由于在处理Web应用下的文件创建与移动等,因此涉及到很多关于java
中相对路径,绝对路径等问题。同时,对于Web应用中的相对路径,绝对路径,以及Java.io.File
类学习了一下。也找了一些资料。希望大家遇到类似的问题,可以更有效的解决。

 

1.基本概念的理解

 

  绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:
C:/xyz/test.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个
URL绝对路径。

  相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在
Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,
"../"代表上级目录。这种类似的表示,也是属于相对路径。

另外关于URI,URL,URN等内容,请参考RFC相关文档标准。

RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax, 
(http://www.ietf.org/rfc/rfc2396.txt)

 

2.关于JSP/Servlet中的相对路径和绝对路径。

 

2.1服务器端的地址

   服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的
(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候
在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://192.168.0.1/webapp/的。

  其用到的地方有: 
 forward:servlet中的request.getRequestDispatcher(address);这个address是
在服务器端解析的,所以,你要forward到a.jsp应该这么写:
request.getRequestDispatcher(“/user/a.jsp”)这个/相对于当前的web应用webapp,
其绝对地址就是:http://192.168.0.1/webapp/user/a.jsp。 
sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

 

2.2、客户端的地址  


       所有的html页面中的相对地址都是相对于服务器根目录(http://192.168.0.1/)的,
而不是(跟目录下的该Web应用的目录)http://192.168.0.1/webapp/的。 
 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的,
所以,如果提交到a.jsp为:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()%>"/user/a.jsp;
  提交到servlet为actiom="/webapp/handleservlet"  
   Javascript也是在客户端解析的,所以其相对路径和form表单一样。 
 

  因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上
<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。
另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样
当文件移动时,很容易出问题

 

3. JSP/Servlet中获得当前应用的相对路径和绝对路径


3.1 JSP中获得当前应用的相对路径和绝对路径


 根目录所对应的绝对路径:request.getRequestURI()
 文件的绝对路径     :application.getRealPath(request.getRequestURI());
 当前web应用的绝对路径 :application.getRealPath("/");
 取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()

 

3.2 Servlet中获得当前应用的相对路径和绝对路径


 根目录所对应的绝对路径:request.getServletPath();
 文件的绝对路径    :request.getSession().getServletContext().getRealPath
(request.getRequestURI())   
 当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");
     (ServletContext对象获得几种方式:
       javax.servlet.http.HttpSession.getServletContext() 
       javax.servlet.jsp.PageContext.getServletContext() 
       javax.servlet.ServletConfig.getServletContext() 
     )

 

4.java 的Class中获得相对路径,绝对路径的方法


4.1单独的Java类中获得绝对路径


  根据java.io.File的Doc文挡,可知:
 默认情况下new File("/")代表的目录为:System.getProperty("user.dir")。
 一下程序获得执行类的当前路径
package org.cheng.file;
import java.io.File;

public class FileTest {
    public static void main(String[] args) throws Exception {      

  System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));    

  System.out.println(FileTest.class.getClassLoader().getResource(""));       

  System.out.println(ClassLoader.getSystemResource(""));        
  System.out.println(FileTest.class.getResource(""));        
  System.out.println(FileTest.class.getResource("/")); //Class文件所在路径  
  System.out.println(new File("/").getAbsolutePath());        
  System.out.println(System.getProperty("user.dir"));    
 }
}

 

4.2服务器中的Java类获得当前路径(来自网络)


(1).Weblogic

WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c:/bea/weblogic700.....
那么,你的文件根路径就是c:/.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:/yourconfig/yourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径的根目录就是你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放

在yourwebapp/yourconfig/yourconf.properties,
这样使用:
new FileInputStream("./yourconfig/yourconf.properties");
这两种方式均可,自己选择。

(2).Tomcat

在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin

(3).Resin

不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET
的路径为根.比如用新建文件法测试File f = new File("a.htm");
这个a.htm在resin的安装目录下

(4).如何读相对路径哪?

在Java文件中getResource或getResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web

发布根路径下WEB-INF/classes

默认使用该方法的路径是:WEB-INF/classes。已经在Tomcat中测试。

 

5.读取文件时的相对路径,避免硬编码和绝对路径的使用。(来自网络)


5.1 采用Spring的DI机制获得文件,避免硬编码。
   参考下面的连接内容:
   http://www.javajia.net/viewtopic.php?p=90213&
5.2 配置文件的读取
 参考下面的连接内容:
 http://dev.csdn.net/develop/article/39/39681.shtm
5.3 通过虚拟路径或相对路径读取一个xml文件,避免硬编码
 参考下面的连接内容:
 http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8
 


6.Java中文件的常用操作(复制,移动,删除,创建等)(来自网络)


 常用 java File 操作类 
 http://www.easydone.cn/014/200604022353065155.htm
 
 Java文件操作大全(JSP中)
 http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

 java文件操作详解(Java中文网)
 http://www.51cto.com/html/2005/1108/10947.htm

 JAVA 如何创建/删除/修改/复制目录及文件
 http://www.gamvan.com/developer/java/2005/2/264.html

 

总结:


 通过上面内容的使用,可以解决在Web应用服务器端,移动文件,查找文件,复制
 删除文件等操作,同时对服务器的相对地址,绝对地址概念更加清晰。
建议参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.等内容了解透彻
对其他方面的理解可以更加深入和透彻。
==================================================================================

参考资料:
java/docs/

java.io.File
java.io.InputStream
java.io.OutputStream
java.io.FileInputStream
java.io.FileReader;
java.io.FileOutputStream
java.io.FileWriter;
java.net.URI
java.net.URL

绝对路径与相对路径祥解
http://www.webjx.com/htmldata/2005-02-26/1109430310.html

[『J道习练』]JSP和Servlet中的绝对路径和相对路径
http://w3china.org/blog/more.asp?name=pcthomas&id=9122&commentid=12376

JSP,Servlet,Class获得当前应用的相对路径和绝对路径
http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&tID=886&ccID=77

如何获得当前文件路径
http://www.matrix.org.cn/resource/article/44/44113_java.html

通过Spring注入机制,取得文件
http://www.javajia.net/viewtopic.php?p=90213&

配置文件的读取 
http://dev.csdn.net/develop/article/39/39681.shtm

读取配置文件,通过虚拟路径或相对路径读取一个xml文件,避免硬编码! 
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

常用 java File 操作类
http://www.easydone.cn/014/200604022353065155.htm

Java文件操作大全
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

Java文件操作详解
http://www.51cto.com/html/2005/1108/10947.htm

 

posted @ 2019-05-19 18:43  范仁义  阅读(12412)  评论(0编辑  收藏  举报