Der Systemaufruf "stat" sammelt verschiedene Informationen über die Datei, wie z. B. eine Anzahl von Hardlinks, die auf sie verweisen, oder ihre "Inode" -Nummer. Vielleicht möchten Sie sich den Systemaufruf "access" ansehen, mit dem Sie die Existenzprüfung durchführen können, indem Sie im Modus "F_OK" angeben.
Es gibt jedoch ein kleines Problem mit Ihrem Code. Es versetzt den Prozess jedes Mal für eine Sekunde in den Ruhezustand, wenn er nach Dateien sucht, die noch nicht existieren. Um dies zu vermeiden, müssen Sie die von Jerry Coffin vorgeschlagene API inotify verwenden, um vom Kernel benachrichtigt zu werden, wenn die Datei, auf die Sie warten, vorhanden ist. Beachten Sie, dass inotify Sie nicht benachrichtigt, wenn die Datei bereits vorhanden ist. In der Tat müssen Sie sowohl "access" als auch "inotify" verwenden, um eine Race-Bedingung zu vermeiden, wenn Sie nach der Erstellung nach einer Datei suchen.
Es gibt keinen besseren oder schnelleren Weg zu prüfen, ob eine Datei existiert. Wenn Ihr Dateibrowser die Datei immer noch etwas schneller anzeigt, als das Programm sie erkennt, dann wird wahrscheinlich Greg Hewgills Idee der Umbenennung stattfinden.
Hier ist ein C++ Codebeispiel, das eine inotify Uhr einrichtet, überprüft, ob Datei bereits vorhanden und wartet es anders:
#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);
}
Welche Datei-Browser? Was ist das Schreiben der Datei? Sind Sie sicher, dass die Datei nicht unter einem etwas anderen Namen geschrieben und dann im letzten Moment umbenannt wird? –
Ich benutze Konqueror, aber Delphin benachrichtigt auch meine früheren als stat. Die Datei wird von einer App geschrieben, die ich geschrieben habe, damit ich weiß, wo und wo sie geschrieben werden sollte. Außerdem ist die Datei eine leere Datei, die ich gerade schreibe, um zu signalisieren, dass ein Prozess abgeschlossen ist. –
Wie lange ist diese Verzögerungszeit gemeint? Liegt es in der Größenordnung von Mikrosekunden oder Minuten? Es sollte keinen Grund geben, warum 'stat()' nicht darauf hinweisen sollte, dass die Datei existiert, wenn dies tatsächlich der Fall ist. Ich vermute, dass hier noch etwas anderes vor sich geht, das Sie noch nicht erkannt haben. –