Cómo comprobar si un PHP flujo de recursos es lectura o escritura?

En PHP, ¿cómo puedo comprobar si un flujo de recursos (o puntero de archivo, manejar, o como lo queráis llamar) es legible o escritura? Por ejemplo, si usted está frente a una situación donde usted no sabe nada acerca de cómo el recurso fue abierto o creado, ¿cómo se puede comprobar si es legible? Y ¿cómo se puede comprobar si es escritura?

Basado en las pruebas que he hecho (solo con los archivos de texto normales usando PHP 5.3.3), fread() no tira ningún error en cualquier nivel cuando el recurso no es legible. Sólo se devuelve una cadena vacía, pero también hace que para un archivo vacío. Y lo ideal sería mejor tener un cheque que no modifica el propio recurso. Prueba si un recurso es legible tratando de leer de que va a cambiar la posición del puntero.

Por el contrario, fwrite() no tira ningún error en cualquier nivel cuando el recurso no es modificable. Sólo devuelve cero. Esto es un poco más útil, porque si usted estaba tratando de escribir un determinado número de bytes en un archivo y fwrite() devuelve cero, usted sabe que algo salió mal. Pero aún así, este no es un método ideal, ya que sería mucho mejor para saber si se escritura antes de volver a escribir en él en lugar de tratar de escribir y ver si se produce un error.

También, idealmente, el cheque debe trabajar en cualquier tipo de flujo de recursos, no sólo los archivos.

Es esto posible? No hace nada de esto existe? He sido incapaz de encontrar nada útil. Gracias de antemano por sus respuestas.

  • Por supuesto, tanto fread() y fwrite() volver bool(false) en caso de falla de acuerdo a su respectiva página de documentación…. Pero eso no sucede en PHP 5.3.5.
InformationsquelleAutor jnrbsn | 2011-03-14

2 Kommentare

  1. 26

    Bastante simple. Simplemente llame a stream_get_meta_data($recurso) de la secuencia de comandos, a continuación, compruebe el mode elemento de la matriz del valor de retorno:

    $f = fopen($file, 'r');
    $meta = stream_get_meta_data($f);
    var_dump($meta['mode']); //r

    Y si quieres saber si los datos subyacentes se puede escribir:

    var_dump(is_writable($meta['uri'])); //true if the file/uri is writable
    • The stream can be any stream created by fopen(), fsockopen() and pfsockopen(). No funciona en todos los archivos abiertos con fwrite? fread? Mejor que mi solución, en algunos casos, mucho, mucho peor que en otros… editar no importa, fread y fwrite USE las asas abiertas por fopen. Soy un idiota.
    • no se puede abrir un archivo con fwrite o fread. Estas funciones sólo funcionan en el abierto de los arroyos. Esta función trabajará en todos los flujos de recursos en PHP. Así que no veo cómo podría alguna vez ser mucho, mucho peor. De hecho, esto es 100% independiente de la plataforma y trabajar con el flujo de contenedores así. Por lo que es realmente la solución correcta…
    • Creo que me gusta esto. ¿Sabe usted si la tabla de los modos en el fopen() página en el manual es una lista completamente exhaustiva?
    • href=»http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/main/streams/plain_wrapper.c?revision=308011&view=markup» >de Acuerdo con el código fuente, sí es completamente exhaustiva. (Línea 56 en ese archivo, en caso que usted no sabe C demasiado bien)…
    • Wow. Gracias por ir la milla extra para encontrar que para mí. Que también me da una idea de la lógica que debo utilizar para analizar el modo en mi propio código. Gracias.
  2. 1

    Bien, así que este puede no ser la mejor solución, pero creo que es suficiente, dado que no hay nada en PHP para hacer esto automáticamente.

    Para el primer paso, usted conseguirá el inodo de los recursos desde el archivo y, a continuación, leer el nombre de archivo:

    $stat = fstat($fp);
    $inode = $stat['ino'];
    system("find -inum $inode", $result);

    Tomado directamente de esta pregunta acerca de cómo encontrar el nombre de archivo de un filehandle.

    Ahora que tiene el nombre de archivo (en $result) se puede hacer un fileperms($result) en él para obtener los permisos de salida.

    Nota que fileperms() devuelve un int, y la documentación de la magia (en realidad, sólo el tratamiento de la int como un octal) de retención que un 0 a la izquierda (por ejemplo, 0755).

    También tenga en cuenta que la documentación de la magia de la conversión de que la int en una bonita cadena como -rw-r--r--

    • Suponiendo que el recurso es un archivo para comenzar con. Podría ser un socket, o php://stdin.
    • …y el sistema *nix. No es perfecto, por cualquier medio, pero yo creo es la mejor que PHP puede hacer?
    • También es bastante posible que el archivo puede ser modificable, pero que el filehandle está abierto sólo para la lectura. Esto es bastante inteligente, aunque.
    • Esto no es realmente una respuesta a mi pregunta, en mi opinión. Como dijo Andrew, esto sólo funciona con archivos. También, que ni siquiera funciona en todos los sistemas *nix. Que encontrar comando no funciona en mi OS X de la máquina. También, como Charles señaló, sólo porque el archivo es de escritura o de lectura, esto no significa que el recurso que apunta a que es el mismo. Me estaba preguntando acerca de los recursos, no los archivos.
    • Por no hablar de que fileperms no es una buena manera de comprobar si usted puede leer o escribir a un archivo. conlleva más que. Si realmente quería hacer esto, llame a is_readable($file) y is_writable($file). Pero no hay ninguna razón para descender al nivel de los inodos, cuando hay funciones que permiten el acceso directo para el nombre de archivo de un flujo abierto…
    • Cómo hacer proponer encontrar el nombre de archivo para pasar a la is_readable y is_writeable?
    • Supuse que ya se estaban utilizando «los archivos de texto normales» a la prueba, esta solución sería útil. editar por cierto, aquí un enlace para el OS X, comando»buscar»
    • mediante el stream_get_meta_data() función que me enlace a la demo y en mi respuesta. Fue construido por esto, y funciona con todos los tipos de secuencia, incluyendo flujo de contenedores.
    • Yo estaba probando con «los archivos de texto normales» sólo para ver cómo fread() iba a reaccionar a una que no sea legible de los recursos, y cómo fwrite() iba a reaccionar a un no-escritura de los recursos. También me dijo, «También, idealmente, el cheque debe trabajar en cualquier tipo de flujo de recursos, no sólo los archivos.» Además, sé que el comando find existe en OS X. yo era simplemente señalando que la sintaxis del comando no es compatible con todas las formas de *nix.
    • este será mi último comentario, ya estoy cansado de discutir con usted. <sarcasmo> discúlpenme por no telepáticamente adivinar qué sistema operativo está utilizando, y posteriormente cambiar MI respuesta a SU problema, para que se ajuste a SUS necesidades exactamente. </sarcasmo> Si usted sabía que el comando find existe, y usted sabía que yo no era consciente de su entorno operativo, ¿por qué no me dices el sistema operativo, o utilizar tu cerebro para modificar el comando para trabajar en su sistema operativo? Además, dado que yo no era consciente de la stream_get_meta_data() que @ircmaxell publicado, este fue un intento de ser ÚTIL. Mi error.
    • El sistema operativo que estoy usando es irrelevante. Yo estaba respondiendo a su implicación de que su solución trabajado en todos los sistemas *nix. Estoy de acuerdo en que la solución era un poco útil, y yo no estaba tratando de discutir con usted (pido disculpas por dar esa impresión). Sin embargo, la solución no era realmente una solución para el problema que se intenta resolver.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea