¿Hay alguna manera portátil (en sistemas POSIX) para determinar si un descriptor de archivo es buscable? Mi idea es usar lseek(fd, 0, SEEK_CUR);
y verificar si el valor de retorno es -1, pero no estoy seguro si esto podría dar falsos negativos o falsos positivos. Usar fstat
y hacer suposiciones sobre qué tipos de archivos son buscables/no buscables no parece una buena idea. ¿Alguna otra idea?¿Cómo determinar si un descriptor de archivo es buscable?
Respuesta
El método lseek
parece razonable. Ciertamente no puede causar un falso negativo; si lo hizo, algo está muy mal con la implementación. Además, según el POSIX spec, se supone que falla si el descriptor es un conducto, FIFO o socket, por lo que, en teoría, tampoco debería tener falsos positivos. La única pregunta restante es qué tan bien diferentes sistemas cumplen con las especificaciones. Sin embargo, parece que cualquier otro método, cualquiera que sea, definitivamente sería menos portátil que esto.
Puede usar fstat(), luego la macro S_ISREG en el campo de modo de la estructura de estadísticas para comprobar si se trata de un archivo normal; un archivo normal, per definiton, es buscable, mientras que un archivo "no regular" (especial) puede no serlo (no sé si hay archivos especiales que también se pueden buscar).
Pero sí, verificar el valor de retorno de lseek() y errno == ESPIPE también debería funcionar. En principio, the effect of lseek() on devices which are incapable of seeking is implementation-defined, así que ten cuidado con los demonios nasales.
- 1. Determinar si un descriptor de archivo legible es el final de lectura de un conducto
- 2. ¿Cómo puedo determinar si un archivo es un archivo PDF?
- 3. Determinar si un archivo es un duplicado
- 4. ¿Cómo verificar si un descriptor de archivo tiene datos disponibles?
- 5. Comprobar si el descriptor de archivo es válido
- 6. Python: determinar si un objeto es similar a un archivo
- 7. ¿Cómo puedo determinar si un archivo es un archivo de imagen en .NET?
- 8. NUL descriptor de archivo (isatty es falso)
- 9. descriptor de socket vs descriptor de archivo
- 10. ¿Cómo obtener un puntero ARCHIVO desde un descriptor de archivo?
- 11. ¿Qué es un descriptor?
- 12. Determinar si un archivo está abierto
- 13. ¿Cómo determinar si un tipo es un tipo de colección?
- 14. descriptor de archivo de un std :: fstream
- 15. ¿Cómo puedo determinar si un manejador de archivo Perl es un manejador de lectura o escritura?
- 16. ¿Fopen crea un descriptor de archivo?
- 17. ¿Cómo determinar si un archivo abierto es un socket o un conducto?
- 18. ¿Cómo puedo determinar si un archivo está vacío?
- 19. Perl, ¿cómo determinar si un valor variable es un número?
- 20. cómo determinar si un carácter es un carácter chino
- 21. En c, ¿cómo hacer que un descriptor de archivo bloquee?
- 22. android buscable no funciona
- 23. ¿Cómo puedo determinar si un archivo está bloqueado con VBS?
- 24. ¿Cómo determinar si una ruta es un subdirectorio de otra?
- 25. Cómo determinar si una excepción es de un tipo particular
- 26. ¿Cómo determinar si algo es miembro de un conjunto ordenado?
- 27. Cómo determinar si KeyCode es carácter imprimible
- 28. ¿Cómo determinar si Type es una estructura?
- 29. cómo determinar si una imagen es explícita
- 30. ¿ftell en un descriptor de archivo?
Los dispositivos de bloque, como los discos duros, pueden ser buscables. Tal vez incluso dispositivos de personajes, pero no estoy seguro. – Thomas
algunos dispositivos que no son realmente buscables no fallarán la búsqueda (al menos en Linux, alguien intentó hacer que la búsqueda fallara pero descubrió aplicaciones de espacio de usuario que dependían del comportamiento ...) – Spudd86
Verdadero; algunos controladores de dispositivos de caracteres simplemente ignoran seek() y regresan silenciosamente. –