Cuộc gọi hệ thống "stat" đang thu thập thông tin khác về tệp, chẳng hạn như, một số liên kết cứng trỏ đến nó hoặc số "inode" của nó. Bạn có thể muốn xem cuộc gọi hệ thống "truy cập" mà bạn có thể sử dụng để thực hiện kiểm tra sự tồn tại chỉ bằng cách chỉ định cờ "F_OK" trong "chế độ".
Tuy nhiên, có một vấn đề nhỏ với mã của bạn. Nó đặt quá trình để ngủ cho một thứ hai mỗi khi nó kiểm tra các tập tin mà không tồn tại được nêu ra. Để tránh điều đó, bạn phải sử dụng API inotify, theo đề xuất của Jerry Coffin, để nhận thông báo bằng hạt nhân khi tệp bạn đang chờ ở đó. Hãy nhớ rằng inotify không thông báo cho bạn nếu tập tin đã có, vì vậy trên thực tế bạn cần sử dụng cả "truy cập" và "inotify" để tránh tình trạng chạy khi bạn bắt đầu xem một tệp ngay sau khi tệp được tạo.
Không có cách nào tốt hơn hoặc nhanh hơn để kiểm tra xem tệp có tồn tại hay không. Nếu trình duyệt tệp của bạn vẫn hiển thị tệp nhanh hơn một chút so với chương trình này phát hiện ra, thì ý tưởng đổi tên của Greg Hewgill có thể đang diễn ra.
Đây là một mã C++ ví dụ mà thiết lập một hồ inotify, kiểm tra nếu tập tin đã tồn tại và chờ đợi cho nó bằng cách khác: Trình duyệt
#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);
}
Nguồn
2010-07-29 14:35:00
tập tin gì? Viết tập tin là gì? Bạn có chắc tệp không được viết dưới tên hơi khác và sau đó được đổi tên vào giây phút cuối cùng không? –
Tôi đang sử dụng konqueror, nhưng cá heo cũng thông báo cho tôi sớm hơn stat. tệp được viết bởi ứng dụng tôi đã viết, vì vậy tôi biết nội dung và vị trí cần được viết. Ngoài ra, tập tin là một tập tin trống tôi đang viết chỉ để báo hiệu rằng một quá trình đã hoàn thành. –
Thời gian trễ này là bao lâu? Là nó trên thứ tự của micro giây, hoặc phút? Không nên có lý do tại sao 'stat()' không thể chỉ ra tệp tồn tại khi nó thực sự. Tôi nghi ngờ có cái gì khác đang xảy ra ở đây mà bạn chưa được công nhận. –