2010-05-08 47 views
5

Cách tốt nhất để tôi kiểm tra tệp mới được thêm vào thư mục là gì, tôi không nghĩ rằng trình theo dõi tệp sẽ phù hợp vì đây không phải là dịch vụ luôn hoạt động mà là một phương pháp chạy khi chương trình của tôi khởi động.giám sát thư mục

có hơn 20.000 tệp trong cấu trúc thư mục mà tôi đang theo dõi, hiện tại tôi đang kiểm tra từng tệp để xem tệp có trong bảng cơ sở dữ liệu của tôi hay không, tuy nhiên việc này mất khoảng 10 phút và tôi muốn tăng tốc có thể,

Tôi có thể lưu trữ ngày mà thư mục được kiểm tra lần cuối - thật dễ dàng để có được tất cả các tệp với ngày tạo đã được tạo> ngày được chọn cuối cùng.

có ai có ý tưởng nào không?

Cảm ơn

Đánh dấu

+0

Đây là một vấn đề thú vị. Không có cách nào tôi biết về việc theo dõi các thay đổi đối với một thư mục mà không cần có một chương trình thường trú bộ nhớ để đăng ký các sự kiện đó. (và, nhân tiện, những người xem đó cũng có những hạn chế của họ). Có thể bạn sẽ phải quét lại cây thư mục (khi khởi động, định kỳ, bất cứ khi nào) và câu hỏi duy nhất là làm thế nào để thực hiện nó một cách nhanh chóng và hiệu quả nhất có thể. –

Trả lời

5

Cách tiếp cận của bạn là khả thi duy nhất (tức là trình xem hệ thống tệp cho phép bạn xem các thay đổi, không kiểm tra bắt đầu).

Tìm hiểu điều gì mất quá nhiều thời gian. 20.000 kiểm tra không nên mất 10 phút - có thể 1 tối đa. Chương trình của bạn được viết chậm. Làm thế nào để bạn kiểm tra nó?

Gợi ý: không hỏi cơ sở dữ liệu, nhận danh sách tất cả các tệp vào bộ nhớ, danh sách tất cả các tệp trong cơ sở dữ liệu, kiểm tra bộ nhớ. 20.000 câu lệnh SQL vào cơ sở dữ liệu quá chậm, theo cách này bạn cần ONE để lấy danh sách.

+0

Chúc mừng cho các gợi ý tomtom, bạn đang đúng về chương trình của tôi gọi cơ sở dữ liệu cho mỗi tập tin, chắc chắn một khu vực tôi có thể refactor. – foz1284

0

Bạn có thể viết một dịch vụ chạy trên máy đó? Sau đó, dịch vụ có thể sử dụng FileSystemWtcher

+0

cảm ơn, tôi đã nghĩ về điều đó nhưng không thích ý tưởng có dịch vụ, chỉ là sở thích cá nhân – foz1284

+0

Điều đó sẽ không đảm bảo rằng bạn sẽ không bỏ lỡ bất kỳ thay đổi nào. Ngoài ra - nói chung - có một dịch vụ chỉ chạy cho một ứng dụng chạy mọi lúc và sau đó là thiết kế tồi. Tất nhiên, trong trường hợp này nó có thể chấp nhận được; nó phụ thuộc vào loại ứng dụng. – Thorarin

1

FileSystemWatchernotreliable, vì vậy ngay cả khi bạn có thể sử dụng dịch vụ, nó sẽ không nhất thiết phù hợp với bạn.

Hai tùy chọn tôi có thể thấy là:

  1. Giữ một danh sách các tập tin mà bạn biết và giữ so với danh sách này. Điều này sẽ cho phép bạn xem các tập tin đã được thêm vào, xóa, vv Giữ danh sách này trong bộ nhớ, thay vì truy vấn cơ sở dữ liệu cho mỗi tập tin.
  2. Như bạn đề xuất, hãy lưu dấu thời gian và so sánh với dấu thời gian đó.
+0

Phương pháp dấu thời gian sẽ hoạt động thực sự tốt, nhưng * chỉ * nếu bạn không phải kiểm tra các tệp đã xóa. Đó không phải là một phần của câu hỏi, nhưng nó có ý nghĩa rằng bạn sẽ thích thú khi biết điều đó. Có thể, bạn có thể thực hiện kiểm tra các tệp đã xóa ít thường xuyên hơn hoặc trong nền hoặc thứ gì đó. – Thorarin

2

10 phút có vẻ quá dài đối với 20.000 tệp. Làm thế nào bạn sẽ làm việc so sánh? Đề xuất của bạn cũng không tính đến các tệp đã xóa. Nếu bạn muốn loại bỏ những người từ cơ sở dữ liệu, bạn sẽ phải làm một so sánh đầy đủ.

Có thể sự cố là các chuyến đi vòng cơ sở dữ liệu. Bạn có thể lấy danh sách tệp đã biết từ cơ sở dữ liệu trong các khối lớn (hoặc tất cả cùng một lúc), được sắp xếp theo thứ tự bảng chữ cái. Sắp xếp danh sách tệp cục bộ và đi bộ hai danh sách, xử lý các mục nhập thiếu hoặc mới khi bạn đi theo.

+0

bạn đang đúng về vấn đề là chuyến đi vòng, tôi không cần phải lo lắng về các tập tin đã xóa như tôi đang kiểm tra này mỗi lần tôi cố gắng để tải một tập tin cổ vũ – foz1284

+0

@ foz1284: trong trường hợp đó, sử dụng dấu thời gian là một tùy chọn. Chúng không đáng tin cậy về mặt kỹ thuật 100%, bởi vì ai đó có thể thay đổi dấu thời gian trên một tệp. Tuy nhiên, đó có thể không phải là vấn đề trong trường hợp của bạn. – Mick

0

Có dịch vụ FileSystemWatcher như Kevin Jones gợi ý có lẽ là câu trả lời thực tế nhất, nhưng có một số tùy chọn khác.

Bạn có thể xem thư mục có inotify nếu bạn gắn nó với Samba trên một hộp linux. Điều đó tất nhiên giả định bạn không nhớ phân mảnh nền tảng của bạn, nhưng đó là những gì inotify là có cho.

Và sau đó chính xác hơn nhưng với ít cơ hội hơn để bạn có thể tiếp tục, nếu bạn đang theo dõi thư mục có tệp 20K trong đó có lẽ là lúc để phát triển kiến ​​trúc hệ thống của bạn. Không biết nhiều hơn về ứng dụng của bạn, có vẻ như hàng đợi tin nhắn có thể đáng xem.

+0

ứng dụng loại hình quản lý hình ảnh của nó nên cấu trúc chỉ là thư mục ảnh của tôi, như thorrarin nói, có một dịch vụ chạy cho chương trình này mà chỉ có thể chạy một cách không thường xuyên có vẻ quá mức cần thiết – foz1284

1

Bạn có thể viết ở đâu đó dấu thời gian cuối cùng mà onfile được tạo, nó rất đơn giản và có thể hoạt động cho bạn.

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