Tôi đã tự hỏi nếu có một cách để chờ đợi cho một tập tin được cập nhật, và sau đó đọc từ nó một khi nó được cập nhật. Vì vậy, nếu tôi có file.txt
, tôi muốn đợi cho đến khi một cái gì đó mới được ghi vào nó, và sau đó đọc nó/xử lý nó/etc. Hiện tại tôi đang bỏ phiếu bằng cách sử dụng Time::HiRes::sleep(.01)
, nhưng tôi tự hỏi nếu có cách nào tốt hơn. Cảm ơn.Cách tốt nhất để đợi cho đến khi tệp được cập nhật và sau đó đọc từ tệp đó trong Perl?
5
A
Trả lời
9
Có cách nào tốt hơn. Trên cửa sổ, bạn có thể sử dụng giao diện FileSystemWatcher, trên Linux, sử dụng inotify.
của Windows
use Win32::FileSystem::Watcher;
my $watcher = Win32::FileSystem::Watcher->new("c:\\");
# or
my $watcher = Win32::FileSystem::Watcher->new(
"c:\\",
notify_filter => FILE_NOTIFY_ALL,
watch_sub_tree => 1,
);
$watcher->start();
print "Monitoring started.";
sleep(5);
# Get a list of changes since start().
my @entries = $watcher->get_results();
# Get a list of changes since the last get_results()
@entries = $watcher->get_results();
# ... repeat as needed ...
$watcher->stop(); # or undef $watcher
foreach my $entry (@entries) {
print $entry->action_name . " " . $entry->file_name . "\n";
}
# Restart monitoring
# $watcher->start();
# ...
# $watcher->stop();
LINUX
use Linux::Inotify2;
my $inotify = new Linux::Inotify2();
foreach (@ARGV)
{
$inotify->watch($_, IN_ALL_EVENTS);
}
while (1)
{
# By default this will block until something is read
my @events = $inotify->read();
if (scalar(@events)==0)
{
print "read error: $!";
last;
}
foreach (@events)
{
printf "File: %s; Mask: %d\n", $_->fullname, $_->mask;
}
}
2
File::Tail sẽ thăm dò ý kiến các tập tin, nhưng có một vài ưu điểm so với cách tiếp cận của bạn:
- Thời gian thăm dò được tính toán lại tự động dựa trên số của dòng được viết kể từ cuộc thăm dò cuối cùng
- Nếu tệp không thay đổi, việc bỏ phiếu sẽ chậm để tránh sử dụng hết CPU
- Tệp :: Tail sẽ phát hiện xem tệp đã bị cắt ngắn, di chuyển và/hoặc tạo lại hay không mở tệp cho bạn
- Nó có thể gắn một tay cầm tệp thông thường mà bạn có thể sử dụng như bình thường mà không có bất kỳ API hoặc cú pháp đặc biệt nào.
Ví dụ từ perldoc:
use File::Tail;
my $ref=tie *FH,"File::Tail",(name=>$name);
while (<FH>) {
print "$_";
}
Các vấn đề liên quan
- 1. Đợi cho đến khi tệp được mở khóa trong .NET
- 2. Viết để sau đó đọc từ MemoryStream
- 3. Cách phân tích cú pháp tệp CSV, cập nhật trường, sau đó lưu
- 4. Thay đổi bảng sau đó cập nhật
- 5. Cách nhanh nhất để đọc/ghi Bitmap từ/đến tệp?
- 6. từng chờ đợi cho đến khi kết thúc $ .ajax, và sau đó tiếp tục
- 7. Các tệp giai đoạn, sau đó thêm từ xa, sau đó kéo - và các tệp của tôi đã biến mất
- 8. Cách đợi cho đến khi tệp được đóng lại
- 9. Twisted + SQLAlchemy và cách tốt nhất để làm điều đó
- 10. Đọc các tệp nhật ký khi chúng được cập nhật trong Go
- 11. Cách đăng ký một tệp và sau đó xác minh?
- 12. jquery: đợi cho đến khi tất cả các cuộc gọi ajax xong sau đó tiếp tục
- 13. Ghi vào tệp CSV và xuất tệp đó?
- 14. Cập nhật mảng C trong khi đọc tệp đầu vào
- 15. Không thể lấy tên tệp từ xa vào file_get_contents() và sau đó lưu trữ tệp
- 16. tsql: cách tốt nhất để cập nhật bảng db bằng tệp csv
- 17. Cách tìm tệp .js trong đó hàm js nhất định được khai báo (từ Chrome)?
- 18. Có cách nào để cho phép cURL đợi cho đến khi các cập nhật động của trang được thực hiện?
- 19. javascript, đợi cho một cái gì đó là đúng sau đó chạy hành động
- 20. Cách đăng nhập và sau đó tải xuống tệp từ các trang web aspx có R
- 21. Bỏ qua một tệp khi hợp nhất - nhưng bao gồm tệp đó trong các lần đẩy
- 22. Chờ cho đến khi có tệp để đọc với Win32
- 23. Cách tốt nhất để đọc tệp zip trong PHP
- 24. Cách thực hành tốt nhất về cách đợi dữ liệu trong chuỗi và ghi vào tệp?
- 25. Mô-đun Perl tốt nhất để sử dụng để tạo tệp .pdf từ đầu là gì?
- 26. Làm cách nào để tạo tệp và sau đó nén/nén với Heroku?
- 27. cách tạo tệp tai và bao gồm tệp chiến tranh và tệp jar bên trong đó
- 28. Tìm tệp trong Linux sau đó báo cáo kích thước của tệp được tìm kiếm
- 29. C# Cách tốt nhất để làm tối màu cho đến khi có thể đọc được
- 30. Cách tốt nhất để xoay các tệp nhật ký Apache
http://search.cpan.org/perldoc?SGI::FAM và http://search.cpan.org/perldoc?Sys::Gamin có thể làm việc trên các hệ thống tập tin và UNIX nơi inotify không. – ephemient