目錄結構以下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時代,系統新增了目錄結構概念,可是 / 已經被用了,因此只能換一個嘍,因而微軟用反斜槓作了目錄路徑的分隔符。