La llamada al sistema "stat" recopila información diferente sobre el archivo, como, por ejemplo, un número de enlaces duros que apuntan a él o su número "inode". Es posible que desee consultar la llamada al sistema de "acceso" que puede usar para realizar la verificación de existencia solo especificando el indicador "F_OK" en "modo".
Sin embargo, hay un pequeño problema con su código. Pone el proceso a dormir por un segundo cada vez que busca un archivo que aún no existe. Para evitar eso, debe usar la API inotify, como lo sugiere Jerry Coffin, para que el kernel le notifique cuando el archivo que está esperando está allí. Tenga en cuenta que inotify no le notifica si el archivo ya está allí, por lo que, de hecho, necesita usar tanto "access" como "inotify" para evitar una condición de carrera cuando comenzó a buscar un archivo justo después de que se creó.
No hay forma mejor o más rápida de verificar si el archivo existe. Si su buscador de archivos aún muestra el archivo un poco más rápido de lo que este programa lo detecta, entonces la idea de Greg Hewgill sobre el cambio de nombre probablemente esté teniendo lugar.
Aquí es un ejemplo de código C++ que pone en marcha un reloj de inotify, comprueba si el archivo ya existe y espera a que de otro modo: el navegador
#include <cstdio>
#include <cstring>
#include <string>
#include <unistd.h>
#include <sys/inotify.h>
int
main()
{
const std::string directory = "/tmp";
const std::string filename = "test.txt";
const std::string fullpath = directory + "/" + filename;
int fd = inotify_init();
int watch = inotify_add_watch (fd, directory.c_str(),
IN_MODIFY | IN_CREATE | IN_MOVED_TO);
if (access (fullpath.c_str(), F_OK) == 0)
{
printf ("File %s exists.\n", fullpath.c_str());
return 0;
}
char buf [1024 * (sizeof (inotify_event) + 16)];
ssize_t length;
bool isCreated = false;
while (!isCreated)
{
length = read (fd, buf, sizeof (buf));
if (length < 0)
break;
inotify_event *event;
for (size_t i = 0; i < static_cast<size_t> (length);
i += sizeof (inotify_event) + event->len)
{
event = reinterpret_cast<inotify_event *> (&buf[i]);
if (event->len > 0 && filename == event->name)
{
printf ("The file %s was created.\n", event->name);
isCreated = true;
break;
}
}
}
inotify_rm_watch (fd, watch);
close (fd);
}
Qué archivo? ¿Qué está escribiendo el archivo? ¿Estás seguro de que el archivo no se escribe con un nombre ligeramente diferente y luego se renombra en el último momento? –
Estoy usando konqueror, pero dolphin también notifica a mi antes que stat. el archivo está siendo escrito por una aplicación que escribí, así que sé qué y dónde debe escribirse. Además, el archivo es un archivo vacío que estoy escribiendo solo para indicar que se ha completado un proceso. –
¿Cuánto tiempo hace que se está refiriendo a este retraso? ¿Está en el orden de microsegundos o minutos? No debería haber ninguna razón por la cual 'stat()' no pueda indicar que el archivo existe cuando realmente lo hace. Sospecho que hay algo más que sucede aquí que aún no has reconocido. –