2011-12-02 11 views
6

In un computer Windows, il seguente script:PHP glob() in directory tra parentesi

<?php 

mkdir("c:\\[test]"); 
file_put_contents("c:\\[test]\\test.txt", "some content"); 
chdir("c:\\[test]"); 
echo getcwd()."\n"; 
var_dump(glob('*')); 

?> 

visualizza questa:

C:\[test] 
array(0) { 
} 

Quando questo si prevede:

C:\[test] 
array(1) { 
    [0]=> 
    string(8) "test.txt" 
} 

ho capito che glob considera le parentesi come caratteri speciali, quando trovato nello pattern parametro.

Il modello * corrisponde a qualsiasi file nella directory di lavoro corrente. Tuttavia, glob() si comporta come se fosse stato eseguito con il modello c:\\[test]\\*

Le staffe sono poi interpretati come parte del modello, quando in realtà sono parte della directory.

Is glob supposto per trattare la percorso come parte del modello? Preferirei pensare che dovrebbe utilizzare la directory corrente come punto di partenza e quindi elaborare il modello solo.

(tentativo di riassumere): La funzione glob agisce come si sta facendo c:\\[test]\\* come un pattern match, e sta cercando di abbinare sia c:\t\*, c:\e\* o c:\s\*. Ma il pattern è in realtà * e non dovrebbe cercare di abbinarlo.

+0

Non riesco a replicarlo su Mac, puoi controllare se la directory e il file sono veramente creati correttamente nella tua finestra? – ajreal

+2

potrei suggerire l'ovvio, non usare [] nei nomi di dir? –

+2

@Dagon Perché [] non può essere utilizzato nei nomi delle directory? – xdazz

risposta

4

Questo sembra essere coperto come un problema in questo bug report su php.net: https://bugs.php.net/bug.php?id=33047

L'ultimo post su quel thread è su di esso non essere un bug, ma un problema da come tratta glob parentesi, come parte dell'espressione regolare. Non sono sicuro di essere d'accordo. Sembra che tu possa aggirare questo problema, a meno che tu non possa spostarti nella cartella principale.

Se si rimuove il primo requisito di essere nella cartella all'interno [Test], è possibile ottenere l'elenco dei file utilizzando una sintassi come di seguito:

chdir('..'); 
$glob = glob("[[]test[]]/*"); 

Alla luce di queste complicazioni, mi sento di raccomandare di non utilizzare il funzione glob se si verificano problemi su macchine Windows e si guardano altre funzioni di elenco file come readdir.

+1

Non è davvero" la conclusione ", è solo l'ultimo commento pubblicato finora e, a meno che manchi qualcosa, il commento è assolutamente sbagliato. In ogni caso, sembra una segnalazione di bug valida, sebbene sia già chiusa senza una correzione. –

+1

Buon punto, modifico il mio post. –

Problemi correlati