在Windows上使用DIRECTORY_SEPARATOR在file_exists()函数中

3
var_dump(DIRECTORY_SEPARATOR) // string '\' (length=1)
var_dump(file_exists("C:/1212.txt")); // true
var_dump(file_exists("C:\1212.txt")); // false
var_dump(file_exists("C:".DIRECTORY_SEPARATOR."1212.txt")); // false

DIRECTORY_SEPARATOR 是什么作用?为什么使用 DIRECTORY_SEPARATOR 时上述情况是错误的?

7个回答

11

DIRECTORY_SEPARATOR 是用来做什么的?

DIRECTORY_SEPARATOR 根据不同的操作系统平台取值不同,Unix 系统下它的值是"/",Windows 系统下它的值是"\"

为什么上述情况在使用 DIRECTORY_SEPARATOR 时不成立?

因为在双引号字符串中,"\123" 会被解析成字符 "Q" (更多详情请查看PHP 手册)。

当构建 Windows 路径时,你应该转义反斜杠:"C:\\1212.txt" 或者使用单引号字符串:'C:\1212.txt'

一个更好且更简洁的方式是直接在路径字符串中硬编码 Unix 目录分隔符"/"(而不是使用常量),这在 Windows 下同样可行:"C:/1212.txt"


根据https://dev59.com/TnRB5IYBdhLWcg3wbGxB,DIRECTORY_SEPARATOR是必需的,因为有其他不使用/和\的操作系统,请参见http://edward.de.leau.net/is-the-php-directory_separator-constant-really-needed-20130121.html。 - edelwater

9

在提到 IT 技术时,涉及到 PS - 路径分隔符,这里给您一个提示:

Linux 只支持 /

Windows 支持 \/

因此,我的建议是将所有的路径都改为 /

define('DS','/'); //Should work.

如果你正在构建跨平台应用程序,那么考虑这样做。
define('DS','/');
define('BASE_ROOT',str_replace('\\',DS,dirname(__FILE__)));
require_once BASE_ROOT . DS . 'includes' . DS . 'init.php';

那么它应该在两个平台上都很好用。

学习:

http://zh.wikipedia.org/wiki/文件名

http://zh.wikipedia.org/wiki/路径_(计算机科学)


3

尝试:

var_dump(file_exists("C:\\1212.txt"));

反斜杠是转义字符,若要将数字1添加到字符串中,您需要在其后跟随另一个反斜杠。

这将允许您的脚本在Windows上运行。如果您想使您的脚本具有可移植性,请查看RobertPitt的答案,并记得使用区分大小写的文件路径。 - Ultimate Gobblement
大多数Unix发行版区分大小写,而基于NTFS的数据是可选的。我的建议是保持所有字母小写,以支持两个系统。 - RobertPitt

1

DIRECTORY_SEPARATOR 在 Unix 系统上返回 /,在 Windows 上返回 \


0

我在博客和其他地方看到了一些错误,认为Windows使用正斜杠“完全没问题”,并且不需要提供\或/字符的*目录分隔符常量,这取决于您运行的是Windows、Nix等...

这些常量非常必要,因为Windows中对正斜杠的支持仅部分实现。

大多数Windows命令行实用程序使用/(正斜杠)而不是连字符-来访问开关,这是Unix风格。这就是为什么脚本中的目录分隔符常量很重要的原因。

错误示例:

C:\Temp>del C:/Temp/*.o /S /Q

错误消息:无效开关 - “Temp”。

C:\Temp>


0

DIRECTORY_SEPARATOR 是 PHP 常量,帮助程序员编写可在不同操作系统上运行的脚本。

假设您正在使用 Windows 计算机,看起来您的配置有误。


0
DIRECTORY_SEPARATOR非常<弗通用>。
我认为应该<明确地>将其删除。
没有使用其他字符的操作系统,我的意思是你在其中运行Web服务器的操作系统(MacOS经典版?说真的吗?)
回复“Wind And Flame”的评论,他的示例也有问题,因为如果您决定执行系统命令,则无论如何都会失去可移植性。当然,系统命令用系统语法表示。但是,PHP命令中包装系统调用的所有命令(例如fopen,file_get_content等)在Windows上都可以很好地工作,并且使用'/'。

2019年了,Windows仍然使用\C:\ Temp> del C:/ Temp / * .o / S / Q 错误信息:无效的开关有关详细信息,请参阅e.s. kohen的答案。 - Bhaskar Choudhary
1
好的。我在谈论文件函数中使用的路径,例如fopen()、file_get_contents()等。 - Nadir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接