文件系统组件

编辑该页面

文件系统组件

文件系统组件提供独立于平台的文件系统操作的实用程序和文件/目录路径操作。

安装

1
美元作曲家需要symfony /文件系欧宝娱乐app下载地址统

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

使用

该组件包含两个主要的类调用文件系统路径:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址\组件\文件系统\异常\IOExceptionInterface;使用欧宝娱乐app下载地址\组件\文件系统\文件系统;使用欧宝娱乐app下载地址\组件\文件系统\路径;美元文件系统=文件系统();试一试{美元文件系统- >mkdir(路径::正常化(sys_get_temp_dir ()。' / '.random_int (0,1000年)));}(IOExceptionInterface美元异常){回声“创建目录时出错”美元异常- >getPath ();}

文件系统实用程序

mkdir

mkdir ()创建一个目录递归地。在POSIX文件系统目录创建一个默认值0777年。您可以使用第二个参数来设置自己的模式:

1
美元文件系统- >mkdir (“/ tmp /照片”,0700年);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

请注意

这个函数忽略了已经存在的目录。

请注意

受当前的目录权限umask。设置umask你的网络服务器,使用PHP的umask函数或使用修改文件权限函数创建了目录之后。

存在

存在()检查存在的一个或多个文件或目录并返回如果有任何遗漏:

1 2 3 4 5 6
/ /如果这个绝对目录存在,返回true美元文件系统- >存在(“/ tmp /照片”);/ /如果存在rabbit.jpg和瓶子。png不存在,返回false/ /网格工作流路径是相对于运行PHP脚本的目录存储美元文件系统- >存在([“rabbit.jpg”,“bottle.png”]);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

复制

副本()复制一个文件(使用镜子()复制目录)。如果目标已经存在,只有在源文件复制修改日期晚于目标。这种行为可以被第三布尔参数:

1 2 3 4 5
/ /工作只有image-ICC image.jpg后已经被修改美元文件系统- >复制(“image-ICC.jpg”,“image.jpg”);/ / image.jpg将覆盖美元文件系统- >复制(“image-ICC.jpg”,“image.jpg”,真正的);

触摸

联系()设定文件的访问和修改时间。默认使用当前时间。你可以设置自己的第二个参数。第三个参数是访问时间:

1 2 3 4 5 6
/ /修改时间设置为当前时间戳美元文件系统- >联系(“file.txt”);/ /设置修改时间10秒美元文件系统- >联系(“file.txt”、时间()+10);/ /设置访问时间10秒美元文件系统- >联系(“file.txt”时间(),()10);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

乔恩

乔恩()更改一个文件的所有者。第三个参数是一个布尔值递归选项:

1 2 3 4
/ /设置www - data。小猫咪图片视频的主人美元文件系统- >乔恩(“lolcat.mp4”,www - data”的);/ /递归地改变视频目录的所有者美元文件系统- >乔恩(/视频的,www - data”的,真正的);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

chgrp

chgrp ()文件的组织变化。第三个参数是一个布尔值递归选项:

1 2 3 4
/ /设置组小猫咪图片视频nginx美元文件系统- >chgrp (“lolcat.mp4”,nginx的);/ /更改群视频目录递归地美元文件系统- >chgrp (/视频的,nginx的,真正的);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

修改文件权限

chmod ()变化的模式或权限文件。第四个参数是一个布尔值递归选项:

1 2 3 4
/ /视频的模式设置为0600美元文件系统- >chmod (“video.ogg”,0600年);/ / src目录递归的模式变化美元文件系统- >chmod (“src”,0700年,0000年,真正的);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

删除

remove ()删除文件、目录和符号链接:

1
美元文件系统- >删除([符号链接的,“/道路/ /目录”,“activity.log”]);

请注意

你可以通过一个数组或任何可否认的对象作为第一个参数。

重命名

重命名()更改一个文件或目录的名称:

1 2 3 4 5 6
/ /重命名一个文件美元文件系统- >重命名(“/ tmp / processed_video.ogg”,“/道路/ /商店/ video_647.ogg”);/ /重命名一个目录美元文件系统- >重命名(“/ tmp /文件”,/ /存储/文件/路径的);/ /如果目标已经存在,第三个布尔参数是用于覆盖。美元文件系统- >重命名(“/ tmp / processed_video2.ogg”,“/道路/ /商店/ video_647.ogg”,真正的);

符号链接()创建一个符号链接从目标到目的地。如果文件系统不支持符号链接,第三个布尔参数是:

1 2 3 4 5
/ /创建一个符号链接美元文件系统- >符号链接(“/道路/ /源”,“/道路/ /目的地”);/ /如果文件系统复制源目录/ /不支持符号链接美元文件系统- >符号链接(“/道路/ /源”,“/道路/ /目的地”,真正的);

指向()阅读链接目标。

指向()方法以同样的方式提供的文件系统组件的行为在所有操作系统上(不像PHP的指向函数):

1 2 3 4 5
/ /返回下一个直接链接的目标没有考虑目标的存在美元文件系统- >指向“/道路/ /链接”);/ /返回其绝对完全解决目标的最终版本(如果有嵌套的链接,它们解决)美元文件系统- >指向“/道路/ /链接”,真正的);

其行为如下:

  • 美元的规范化(默认值):
    • 如果美元的路径不存在或不是一个链接,它返回
    • 如果美元的路径是一个链接,它返回下一个直接链接的目标没有考虑目标的存在。
  • 美元的规范化真正的:
    • 如果美元的路径不存在,则返回null。
    • 如果美元的路径存在,它返回它的绝对完全分解的最终版本。

请注意

如果你想规范化的道路没有检查它的存在,你可以使用规范化()方法相反。

makePathRelative

makePathRelative ()需要两个绝对路径的相对路径,并返回第一个第二个路径:

1 2 3 4 5 6 7
/ /返回“. . /”美元文件系统- >makePathRelative (' / var / 欧宝娱乐app下载地址lib / symfony / src / symfony / ',' / var / 欧宝娱乐app下载地址lib / symfony / src / symfony /组件的);/ /返回的视频/美元文件系统- >makePathRelative (“/ tmp /视频”,“/ tmp”);

镜子

镜子()所有的源目录的内容复制到目标之一(使用副本()方法复制单个文件):

1
美元文件系统- >镜子(“/道路/ /源”,“/道路/ /目标”);

isAbsolutePath

isAbsolutePath ()返回真正的如果给定的路径是绝对的,否则:

1 2 3 4 5 6 7 8
/ /返回true美元文件系统- >isAbsolutePath (“/ tmp”);/ /返回true美元文件系统- >isAbsolutePath (“c: \ Windows \”);/ /返回false美元文件系统- >isAbsolutePath (“tmp”);/ /返回false美元文件系统- >isAbsolutePath (“. . / dir”);

tempnam

tempnam ()创建一个临时文件,一个独特的文件名,并返回它的路径,或者抛出一个异常失败:

1 2 3 4
/ /返回一个路径:/ tmp / prefix_wyjgtF美元文件系统- >tempnam (“/ tmp”,“prefix_”);/ /返回一个路径:/ tmp / prefix_wyjgtF.png美元文件系统- >tempnam (“/ tmp”,“prefix_”,“使用”);

5.1

的选项中设置一个后缀tempnam ()是在Symfony 5.1中引入的。欧宝娱乐app下载地址

dumpFile

dumpFile ()给定的内容保存到一个文件中。它以一个原子的方式:它写入一个临时文件中,然后移动到新文件的位置,当它完成的时候。这意味着用户会看到完整的旧文件或完成新文件(但从不partially-written文件):

1
美元文件系统- >dumpFile (“file.txt”,“Hello World”);

file.txt文件包含你好,世界现在。

appendToFile

appendToFile ()添加新内容的一些文件:

1 2 3
美元文件系统- >appendToFile (“logs.txt”,“电子邮件发送到user@example.com”);/ /第三个参数告诉是否应该锁定在写文件美元文件系统- >appendToFile (“logs.txt”,“电子邮件发送到user@example.com”,真正的);

如果文件或其包含目录不存在,该方法创建之前附加内容。

5.4

第三个参数的appendToFile ()是在Symfony 5.4中引入的。欧宝娱乐app下载地址

路径操作工具

5.4

路径类是在Symfony 5.4中引入的。欧宝娱乐app下载地址

处理文件路径通常涉及一些困难:

  • 平台的差异:文件路径在不同的平台上看起来不同。UNIX文件路径开始削减(“/”),而Windows文件路径从一个系统驱动(“C:”)。UNIX使用正斜杠,而Windows默认使用反斜杠。
  • 绝对/相对路径:web应用程序通常需要处理绝对和相对路径。正确地转换到另一个棘手的和重复的。

路径为解决这些问题提供实用方法。

规范化

返回的最短路径的名称等于给定的路径。它适用于以下规则迭代,直到没有可以做进一步处理:

  • ”,“段切除;
  • “. .”段解析;
  • 反斜杠(\)转换成正斜杠(“/”);
  • 根路径(“/”和“C: / ")总是终止斜杠;
  • 根路径从未终止的削减;
  • 计划(如“phar: / /”)保存;
  • ”“替换用户的主目录。

你可以规范化道路规范化():

1 2
回声路径::规范化(' / var / www / vhost / webmozart / . . / config.ini ');/ / = > /var/www/vhost/config.ini

你可以通过绝对路径和相对路径规范化()方法。相对路径传递时,“. .”部分的路径:

1 2
回声路径::规范化(“. . /上传/ . . / config / config.yaml ');/ / = > . . / config / config.yaml

畸形的返回路径不变:

1 2
回声路径::规范化(“C:项目/ PHP . ini”);/ / = > C:项目/ PHP . ini

将绝对/相对路径

绝对/相对路径转换的方法makeAbsolute ()makeRelative ()

makeAbsolute ()方法接受一个相对路径和基本路径基础上相对路径:

1 2
回声路径::makeAbsolute (“配置/ config.yaml”,“/ var / www /项目”);/ / = > /var/www/project/config/config.yaml

如果一个绝对路径传递的第一个参数,返回绝对路径不变:

1 2
回声路径::makeAbsolute (“/ usr / share / lib / config.ini”,“/ var / www /项目”);/ / = > /usr/share/lib/config.ini

的方法解决“. .”部分,如果有:

1 2
回声路径::makeAbsolute (“. . / config / config.yaml”,/ var / www /项目/上传的);/ / = > /var/www/project/config/config.yaml

这个方法是非常有用的,如果你希望能够接受相对路径(例如,相对于你的项目的根目录),同时绝对路径。

makeRelative ()逆操作吗makeAbsolute ():

1 2
回声路径::makeRelative (" / var / www /项目/ config / config.yaml ',“/ var / www /项目”);/ / = >配置/ config.yaml

如果路径不是在基本路径,该方法将预先考虑“. .”部分是必要的:

1 2
回声路径::makeRelative (" / var / www /项目/ config / config.yaml ',/ var / www /项目/上传的);/ / = > . . / config / config.yaml

使用isAbsolute ()isRelative ()检查是否绝对或相对路径:

1 2
路径::isAbsolute (“C: \程序\ PHP \ PHP . ini”)/ / = >正确的

所有四个方法内部规范化传递的路径。

寻找最长公共基础路径

当你绝对文件路径存储在文件系统中,这将导致大量的重复信息:

1 2 3 4 5 6 7
返回(' / var / www / vhost /项目/ httpdocs / config / config.yaml”,' / var / www / vhost /项目/ httpdocs / config / routing.yaml”,' / var / www / vhost /项目/ httpdocs / config / services.yaml”,' / var / www / vhost /项目/ httpdocs /图片/ banana.gif ',' / var / www / vhost /项目/ httpdocs /上传/图片/ nicer-banana.gif”,);

特别是当存储许多路径,重复信息的数量是明显的。您可以使用getLongestCommonBasePath ()检查的路径列表一个共同的基本路径:

1 2 3 4 5 6 7 8
路径::getLongestCommonBasePath (' / var / www / vhost /项目/ httpdocs / config / config.yaml”,' / var / www / vhost /项目/ httpdocs / config / routing.yaml”,' / var / www / vhost /项目/ httpdocs / config / services.yaml”,' / var / www / vhost /项目/ httpdocs /图片/ banana.gif ',' / var / www / vhost /项目/ httpdocs /上传/图片/ nicer-banana.gif”);/ / = > /var/www/vhosts/project/httpdocs

这条路一起使用makeRelative ()缩短存储路径:

1 2 3 4 5 6 7 8 9
美元英国石油公司=' / var / www / vhost /项目/ httpdocs”;返回(美元英国石油公司“/ config / config.yaml”,美元英国石油公司“/ config / routing.yaml”,美元英国石油公司“/ config / services.yaml”,美元英国石油公司“/图片/ banana.gif”,美元英国石油公司' /上传/图片/ nicer-banana.gif ',);

getLongestCommonBasePath ()总是返回规范化路径。

使用isBasePath ()测试路径是否另一条路径的基本路径:

1 2 3 4 5 6 7 8
路径::isBasePath (" / var / www "," / var / www /项目”);/ / = >正确的路径::isBasePath (" / var / www "," / var / www /项目/ . .”);/ / = >正确的路径::isBasePath (" / var / www "," / var / www /项目/ . . / . .”);/ / = >假

找到目录/根目录

PHP提供了函数目录名获取文件路径的目录路径。这种方法有一些怪癖:

  • 目录名()不接受反斜杠在UNIX
  • 目录名(“C: /项目”)的返回“C:”,不是“C: /
  • 目录名(C: /)“回报”。“”,而不是“C: /
  • 目录名(“C:”)的回报率”。“”,而不是“C: /
  • 目录名(“项目”)的回报率”。“,而不是“”
  • 的目录名()的不规范化的结果

getDirectory ()修复这些缺陷:

1 2
回声路径::getDirectory (“C: \计划”);/ / = > C: /

此外,您可以使用getRoot ()获得的根路径:

1 2 3 4 5
回声路径::getRoot (“/ etc /输入/网站”);/ / = > /回声路径::getRoot (“C: \程序\ Apache \ Config”);/ / = > C: /

错误处理

实现只要错误的事情发生了,一个异常ExceptionInterfaceIOExceptionInterface抛出。

请注意

一个IOException如果抛出目录创建失败。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist