2012-04-03 30 views
6

Tôi đã viết một công cụ để thu thập các tệp nhật ký trong một cửa sổ thời gian được chỉ định bởi người dùng công cụ. Cho đến bây giờ tôi đã dựa vào tập hợp các tệp nhật ký bằng cách sử dụng phương thức File.GetLastWriteTime trên các tệp nhật ký, so sánh với thời gian người dùng đã nhập và thu thập dựa trên kết quả của các so sánh này. Dưới đây là một đoạn mã nhỏ:File.GetLastWriteTime dường như trả về giá trị 'lỗi thời'

DateTime logFileEnd = File.GetLastWriteTime(matchingActiveLogFile); 

Tuy nhiên, tôi nhận thấy công cụ của tôi không thu thập được một số tệp nhật ký mà tôi đã nghĩ. Có vẻ như DateTime được trả về bởi phương thức này đã lỗi thời, (có đăng nhập gần đây hơn trong tệp so với giá trị của datetime này).

Khi tôi xem 'Ngày sửa đổi' của tệp được đề cập, nó cũng đã quá 'lỗi thời', gần đây có đăng nhập tệp hơn 'Ngày sửa đổi'.

Tôi làm cách nào để có được giá trị 'GetLastWriteTime' hoặc Date Modified chính xác?

+0

Ý của bạn là gì bởi * DateTime được trả về theo phương pháp này đã lỗi thời *? – V4Vendetta

+1

ngày không cập nhật sau một thời gian? Ví dụ: khi bạn thấy ngày đó được sửa đổi là 'lỗi thời', hãy đợi ~ 30 giây và sau đó kiểm tra lại ngày. – Reniuz

+1

Cũng đọc bài viết này: http://blogs.technet.com/b/asiasupp/archive/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file- without-closing-it.aspx có thể là bạn gặp cùng một số – Reniuz

Trả lời

9

Trong thời gian hết hạn, tôi đã ném một số vấn đề như của bạn. Trên các hệ thống WindowsVista/7 hoạt động không phải luôn luôn trả lại kết quả đáng tin cậy.

Sau một thời gian chúng tôi tìm thấy liên kết này: Disabling Last Access Time in Windows Vista to improve NTFS performance

và hiểu rằng nó không thể là một "chìa khóa mạnh mẽ". Để giải quyết vấn đề đó, chúng tôi chỉ dừng lại chuyển tiếp trên

GetLastWriteTime 

cuộc gọi, nhưng lưu trữ giá trị thay đổi cuối cùng của tập tin hoặc trong tên của nó, như "FileName_yyyymmdd", hoặc bên trong tập tin trong một số lĩnh vực.

Có một giải pháp cho GetLastAccessTime có thể tìm thấy ở đây:

.NET FileInfo.LastWriteTime & FileInfo.LastAccessTime are wrong, có thể hữu ích trong trường hợp bạn quá.

Ý kiến ​​chung của tôi về điều này sẽ là: không chuyển tiếp tham số đó, nhưng phát minh ra điều gì đó khác trong kiến ​​trúc của bạn.

Chúc may mắn

+3

Tôi đã bị đau đầu với ngày tạo tệp. nếu bạn tạo tập tin, xóa nó và tạo lại nó (cùng tên) ngày tạo sẽ được tạo ra trước đó tập tin. Sau một thời gian tôi thấy rằng hệ điều hành khôi phục lại ngày từ bộ nhớ cache nếu tập tin tái tạo trong thời gian 15 giây. Giải pháp đã thay đổi tên tệp mọi lúc, như bạn đã đề cập. – Reniuz

+1

@Reniuz: âm thanh quen thuộc :) Infact, như chúng tôi đã có rất nhiều khách hàng ở các quốc gia/nền văn hóa hoàn toàn khác nhau, từ WindowsXp -> Windows7 64 bit, thông tin không đáng tin cậy như vậy hoàn toàn không thể chấp nhận được. – Tigran

1

Tigran là đúng:

Bạn có thể thử để so sánh sự thay đổi kích thước tập tin, ngoài việc cuối cùng thời gian ghi. Đó là những gì tôi làm (với FileSystemWatcher, nhưng nó tương tự như so sánh các trường trong một cửa sổ thời gian).

+0

Cảm ơn Eric! Chưa bao giờ nghĩ về điều đó trước đây! – DukeOfMarmalade

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