【问题标题】:Why can't PHP find long filenames?为什么 PHP 找不到长文件名?
【发布时间】:2015-02-09 10:27:00
【问题描述】:

在一个文件夹我有一个文件,名为

`111-aaaaaa aa aaaa-,._aaaaaaa;  aaaaaaaa, aa aaaaaaaaaa, aaaaaaaaa aaaaaaaa.   03.01.10.  38.38 aaaaa.txt`

当我使用 PHP 浏览该目录(或尝试读取该文件)时:

var_dump(glob('MyFolder/*'));exit;

它找不到那个文件。什么问题? (如果我缩短文件名,那么它就可以找到了。我在 Windows 上)

【问题讨论】:

标签: php filenames


【解决方案1】:

尤其是 Windows 在其原始 Win32 API 中的文件名限制非常短。这个一般问题在here at SO讨论。

在 Win32 上的绝对路径中最多可以使用大约 260 个字符。在其他平台上还有其他限制,但预计至少有 512 个字符,而且并非闻所未闻。

(例如,在 GNU HURD 中,文件长度实际上有 is no limit,即使底层文件系统可能会施加限制。)

但是,Windows 实际上可以有更长的文件名(显然,就像您的计算机上的文件名一样)。这可以通过使用较新的 Windows API 来实现。不幸的是,据我所知,标准 PHP 不使用这个 API。

有一个modified 版本的 PHP 使用了这个较新的 Windows API over at Github

使用新 API 的另一个好处是它还支持文件名中的 Unicode 字符。

【讨论】:

  • 嗨!不幸的是,我安装了您指向更长路径支持的扩展,但它仍然存在错误。我测试了fopen("wfio://SHORTER_PATH"),它工作正常,但不是我的漫长道路。有什么想法吗?
  • @MasterDJon,不是真的。您是否像文档所说的那样使用完整路径?除此之外......不是真的,对不起。
  • 是的,我使用的是完整路径(我说“是”是因为我将备份方法更改为将路径存储在文件中并按序号重命名)
【解决方案2】:

试试scandir() 它是在数组中显示列表文件。

【讨论】:

    【解决方案3】:

    从 PHP 7.1 开始,内核直接支持 Windows 上的长路径和 UTF-8 路径。

    干杯。

    【讨论】:

    • 虽然似乎支持 Unicode(不是 UTF-8)路径,但仍然不支持长路径。
    • 不确定你的意思。 UTF-16?事情确实是被告知的 - UTF-8 和长路径。如果您看到一些问题,请检查升级并报告问题。谢谢。
    • 有时,无论如何,即使是较新的 PHP 版本也无法使用长路径。但是,有时,原因可能与我们的想法不同。例如,有一个关于 PHP not being able to work with paths containing certain types of symboling links 的错误(从 7.3.10 和更新版本开始修复),这可能与使用长路径相吻合。无论如何,最后的手段总是使用连接链接:mklink /J "Short\Path" "Your\Very\Long\Path"
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多