2009-07-16 33 views
5

Tôi có một thư mục liên tục điền vào các tệp "vật phẩm". Nhiều chương trình khác nhau kết xuất các tệp tạm thời của họ trong thư mục này và không chắc rằng các chương trình này sẽ sớm tự làm sạch.Phương pháp hiệu quả nhất liên tục xóa tệp cũ hơn X giờ trên Windows là gì?

Trong khi đó, tôi muốn viết chương trình liên tục xóa các tệp trong thư mục này khi chúng trở thành cũ, mà tôi sẽ xác định là "cũ hơn 30 phút".

Một cách tiếp cận điển hình là có cơ chế hẹn giờ liệt kê các tệp trong thư mục, bộ lọc trên nội dung cũ và xóa nội dung cũ. Tuy nhiên, cách tiếp cận này không phải là rất thực hiện trong trường hợp của tôi bởi vì thư mục này có thể hình dung chứa 10 hoặc hàng trăm ngàn tập tin chưa đủ điều kiện như cũ. Do đó, cách tiếp cận này sẽ liên tục lặp trên cùng hàng ngàn tệp để tìm các tệp cũ.

Điều tôi muốn thực sự muốn làm là triển khai một số loại trình nghe thư mục đã được thông báo về bất kỳ tệp mới nào được thêm vào thư mục. Người nghe này sau đó sẽ thêm các tệp đó vào hàng đợi để xóa xuống đường. Tuy nhiên, dường như không có cách nào để thực hiện một giải pháp như vậy trong các ngôn ngữ tôi lập trình (ngôn ngữ JVM như Java và Scala).

Vì vậy: Tôi đang tìm cách hiệu quả nhất để giữ một thư mục "sạch như có thể" trên Windows, tốt nhất là với ngôn ngữ JVM. Ngoài ra, mặc dù tôi chưa bao giờ lập trình với Powershell, tôi sẽ xem xét nó nếu nó cung cấp loại chức năng này. Cuối cùng, nếu có các công cụ của bên thứ ba ngoài đó để làm những việc như vậy, tôi muốn nghe về chúng.

Cảm ơn.

Trả lời

4

Tại sao bạn không thể đưa ra một thư mục được sắp xếp theo system command lâu đời nhất đầu tiên: c:> dir/OD

Lấy kết quả và xóa tất cả các file lớn hơn ngưỡng hoặc giấc ngủ của bạn nếu không có file là đủ tuổi.

Kết hợp với Timer or Executor đặt thành mức chi tiết 1 giây - 1 phút để đảm bảo rằng các tệp không tiếp tục xếp chồng nhanh hơn bạn có thể xóa chúng.

+0

Cảm ơn Kelly. Trên các tệp 100k, một cuộc gọi listFiles() với một AgeFilter mất khoảng 3 phút. Sử dụng dir/OD và sau đó phân tích cú pháp chuỗi kết quả cho các tệp tôi cần (theo thời gian) liên tục chạy khoảng 4 giây. Cải tiến lớn! –

+0

Cảm ơn mọi người vì những câu trả lời tuyệt vời. Đối với trường hợp cụ thể của tôi, trên Windows, sự kết hợp của việc sử dụng java ProcessBuilder và các lệnh hệ thống phù hợp sẽ nhanh hơn nhiều so với cách sử dụng phương thức truyền thống AgeFilter dựa trên java truyền thống –

0

Tôi sẽ đi với C++ cho một tiện ích như thế này - cho phép bạn giao diện với API WIN32, thực sự có các cơ sở nghe thư mục (FindFirstChangeNotification hoặc ReadDirectoryChangesW). Sử dụng một luồng để nghe thông báo thay đổi và cập nhật danh sách tệp của bạn (iirc FFCN yêu cầu bạn phải quét lại thư mục, trong khi RDCW cung cấp cho bạn những thay đổi thực tế).

Nếu bạn giữ danh sách này được sắp xếp theo thời gian sửa đổi, nó trở nên dễ ngủ() chỉ đủ dài để tệp bị lỗi, thay vì bỏ phiếu tại một khoảng thời gian cố định ngẫu nhiên. Bạn có thể muốn thực hiện WaitForSingleObject với thời gian chờ thay vì Ngủ, để phản ứng với những thay đổi bên ngoài (tức là tệp bạn đang chờ để trở thành cũ đã bị xóa bên ngoài, vì vậy bạn sẽ thức dậy và xác định thời điểm tệp tiếp theo sẽ trở nên cũ).

Âm thanh như một công cụ nhỏ thú vị để viết :)

0

Bạn có thể muốn cắn đạn và mã nó trong C# (hoặc VB). Những gì bạn đang yêu cầu được xử lý khá tốt bởi lớp FileSystemWatcher. Nó sẽ làm việc về cơ bản theo cách bạn mô tả. Đăng ký tệp khi chúng được thêm vào thư mục. Có một bộ đếm thời gian định kỳ quét danh sách các tập tin cho những người được cũ và xóa chúng nếu họ vẫn còn đó. Tôi có thể mã nó lên như một dịch vụ Windows đang chạy theo một id dịch vụ có đủ quyền đọc/xóa các tập tin trong thư mục.

EDIT: Google nhanh chóng bật lên FileSystemWatcher for Java này. Phần mềm thương mại. Không bao giờ sử dụng nó, vì vậy không thể bình luận về nó hoạt động tốt như thế nào.

2

Nếu bạn không muốn viết C++, bạn có thể sử dụng Python.Cài đặt pywin32 và sau đó bạn có thể sử dụng API win32 như vậy:

import win32api, win32con 
change_handle = win32api.FindFirstChangeNotification(
    path_to_watch, 
    0, 
    win32con.FILE_NOTIFY_CHANGE_FILE_NAME 
) 

Full giải thích về những gì để làm với điều đó xử lý bởi Tim Vàng ở đây: http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html.

2

Trong Java, bạn cũng có thể sử dụng Apache Commons JCI FAM. Nó là một thư viện java mã nguồn mở mà bạn có thể sử dụng miễn phí.

JDK 7 (được phát hành trong phiên bản beta hiện tại) cũng bao gồm hỗ trợ thông báo tệp. Kiểm tra Java NIO2 tutorial.

Cả hai tùy chọn đều hoạt động cả trên Windows và Linux.

+0

Tuyệt vời. WatchService chính xác là những gì tôi đang tìm kiếm. Tôi nghĩ chương trình của mình sẽ kết thúc 1) "Tìm tất cả các tệp cũ khi khởi động" bằng cách sử dụng gợi ý lệnh hệ thống của Kelly và sau đó 2) khi nó đang chạy, nó sẽ sử dụng WatchService để thêm tệp-to- bị xóa vào hàng đợi. –

+0

Tuyệt vời. Tôi khuyên bạn không nên sử dụng dòng lệnh hệ thống. sử dụng 'File.lastModified' và một biến thể của những gì được đề nghị ở đây: http://stackoverflow.com/questions/1060153/search-entire-computer-for-a-file-name-in-java – notnoop

+0

msaeed, tôi bắt đầu với listFiles và một AgeFilter, nhưng trên các thư mục lớn, nó là con chó chậm. Tôi không phải là một fan hâm mộ của việc sử dụng lệnh hệ thống, nhưng nó nhanh hơn nhiều trong trường hợp cụ thể của tôi –

Các vấn đề liên quan