php的glob方法在windows下的轉義無效的詭異問題。最後有彩蛋

目錄結構以下php

myfolder
    a.txt
[myfolder]
    a.txt

代碼:linux

$files = glob('myfolder/a.txt');
var_dump($files);
$files = glob('[myfolder]/a.txt');
var_dump($files);
//[]在使用中須要轉義
$files = glob('\[myfolder\]/a.txt');
var_dump($files);

windows下輸出git

test.php:7:
array(1) {
  [0] =>
  string(14) "myfolder/a.txt"
}
test.php:14:
array(0) {
}
test.php:21:
array(0) {
}

linux下輸出github

test.php:7:
array(1) {
  [0]=>
  string(14) "myfolder/a.txt"
}
test.php:14:
array(0) {
}
test.php:21:
array(1) {
  [0]=>
  string(16) "[myfolder]/a.txt"
}

無論是windows仍是linux,[]在目錄中都是正常字符c#

爲何windows下就匹配不出來呢?windows

咱們去看php源碼ui

查找PHP_FUNCTION(glob),操作系統

找到關鍵代碼命令行

PHP_FUNCTION(glob)
{
    ...
    if (0 != (ret = glob(pattern, flags & GLOB_FLAGMASK, NULL, &globbuf))) {
    ...
}

繼續查找glob方法的定義翻譯

#ifndef PHP_WIN32
#include <glob.h>
#else
#include "win32/glob.h"
#endif

從這咱們看出,glob方法在windows和linux中是用的2套方法,在linux中用的是linux底層的方法。

咱們再去win32/glob.c下看代碼

找到了下面這幾行關鍵代碼

...
#ifdef PHP_WIN32
    /* Force skipping escape sequences on windows
     * due to the ambiguity with path backslashes
     */
    flags |= GLOB_NOESCAPE;
#endif
...

翻譯下大體意思是,因爲windows下目錄的路徑正反斜槓混用,因此強制不轉義

也就是說windows下,使用glob方法就算你用了反斜槓也不會轉義

啊,問題終於找到了!!!

彩蛋來了

那麼爲何windows用反斜槓作路徑呢?

由於windows前身是ms-dos系統。

dos1時尚未目錄結構的概念,而且當時微軟的開發人員有 DEC 的背景,DEC 的操做系統上是用 / 作命令行參數分割符。

到了dos2.0時代,系統新增了目錄結構概念,可是 / 已經被用了,因此只能換一個嘍,因而微軟用反斜槓作了目錄路徑的分隔符。

彩蛋原文

相關文章
相關標籤/搜索