2011-12-02 23 views
6

En una máquina Windows, la secuencia de comandos siguiente:glob() de PHP en directorios entre corchetes

<?php 

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

?> 

muestra este:

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

Cuando esto se espera:

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

entiendo que glob trata los corchetes como caracteres especiales, cuando se encuentra en pattern parámetro.

El patrón * coincide con cualquier archivo en el directorio de trabajo actual. Sin embargo, glob() se comporta como si se ha ejecutado con el patrón c:\\[test]\\*

Los soportes son entonces se interpretan como parte del modelo, cuando en realidad son parte del directorio.

Está glob supone para el tratamiento de la trayectoriacomo parte del patrón? Preferiría pensar que debería usar el directorio actual como punto de partida, y luego procesar el patrón solo.

(intento de resumir): La función glob actúa como se está haciendo c:\\[test]\\* como un patrón partido, y está tratando de igualar o bien c:\t\*, c:\e\*, o c:\s\*. Pero el patrón es en realidad * y no debería tratar de hacer coincidir nada de eso.

+0

No puedo replicar esto en Mac, ¿puede verificar que el directorio y el archivo realmente se haya creado correctamente en su ventana? – ajreal

+2

¿podría sugerir lo obvio, no use [] en nombres de directorios? –

+2

@Dagon ¿Por qué [] no se puede usar en nombres de directorios? – xdazz

Respuesta

4

Ésta parece ser cubierto como un problema en este informe de error en php.net: https://bugs.php.net/bug.php?id=33047

El último mensaje en ese hilo se trata de que no fuera un error, sino una cuestión de cómo trata pegote soportes, como parte de la expresión regular. No estoy seguro de estar de acuerdo. Parece que puedes evitar esto, a menos que no puedas pasar a la carpeta principal.

Si se quita el primer requisito de estar en la carpeta dentro de [test], se puede obtener la lista de archivos mediante el uso de una sintaxis como la siguiente:

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

Dadas estas complicaciones, yo recomendaría no usar el función global si se encuentra con problemas en las máquinas de Windows, y mira otras funciones de listado de archivos como readdir.

+1

Esa no es realmente la" conclusión ", es solo el último comentario publicado hasta ahora, y a menos que me falta algo, el comentario es completamente incorrecto. Como sea, parece un informe de error válido, aunque ya está cerrado sin una solución. –

+1

Buen punto, voy a editar mi publicación. –

Cuestiones relacionadas