Tôi đang theo dõi một thư mục tệp và độ dài tệp của chúng, ít nhất một trong các tệp này vẫn đang được ghi vào.nhận được chiều dài tệp hiện tại/FileInfo.Lưu trữ bộ nhớ đệm và thông tin cũ
Tôi phải giữ bản ghi cập nhật liên tục của từng độ dài tệp mà tôi sử dụng cho các mục đích khác.
Phương thức Update
được gọi sau mỗi 15 giây và cập nhật các thuộc tính của tệp nếu độ dài tệp khác với độ dài được xác định trong bản cập nhật trước.
Phương pháp cập nhật trông giống như sau:
var directoryInfo = new DirectoryInfo(archiveFolder);
var archiveFiles = directoryInfo.GetFiles()
.OrderByDescending(f=>f.CreationTimeUtc);
foreach (FileInfo fi in archiveFiles)
{
//check if file existed in previous update already
var origFileProps = cachedFiles.GetFileByName(fi.FullName);
if (origFileProps != null && fi.Length == origFileProps.EndOffset)
{
//file length is unchanged
}
else
{
//Update the properties of this file
//set EndOffset of the file to current file length
}
}
Tôi nhận thức được thực tế là DirectoryInfo.GetFiles()
là di trú trước nhiều FileInfo
tài sản bao gồm Length
- và đây là ok miễn là không có bộ nhớ đệm được thực hiện giữa các bản cập nhật (thông tin được lưu trong bộ nhớ cache không được quá 15 giây).
Tôi đã theo giả định rằng mỗi DirectoryInfo.GetFiles()
gọi tạo ra một tập mới của FileInfos
mà tất cả đều được dân cư với thông tin tươi ngay sau đó sử dụng FindFirstFile
/FindNextFile
Win32 API. Nhưng điều này dường như không đúng.
Rất hiếm khi, nhưng cuối cùng chắc chắn tôi chạy vào các tình huống mà độ dài tệp cho tệp được ghi vào không được cập nhật trong 5, 10 hoặc thậm chí 20 phút mỗi lần (thử nghiệm được thực hiện trên Windows 2008 Server x64 nếu điều đó quan trọng).
Cách giải quyết hiện tại là gọi fi.Refresh()
để bắt buộc cập nhật từng thông tin tệp. Nội bộ này dường như ủy quyền cho một cuộc gọi API Win32 GetFileAttributesEx
để cập nhật thông tin tệp.
Mặc dù chi phí buộc làm mới theo cách thủ công có thể chấp nhận được Tôi muốn hiểu rõ hơn lý do tại sao Tôi đang nhận được thông tin cũ ngay từ đầu. Khi nào thông tin FileInfo
được tạo và nó có liên quan như thế nào với cuộc gọi của DirectoryInfo.GetFiles()
? Có một tập tin I/O bộ nhớ đệm lớp bên dưới mà tôi không hoàn toàn nắm bắt?
+1 cho đề xuất hợp lý - tại thời điểm này tôi có giải pháp thay thế và trong thời gian dài có nhiều khả năng sẽ tái cấu trúc bằng cách sử dụng FileSystemWatcher - nhưng điều này không trả lời * lý do * Tôi nhận được thông tin cũ câu hỏi này là tất cả về – BrokenGlass
IMO phải có một số lớp tiền mặt hệ điều hành. Ngay cả khi bạn gọi stream.Flush() nó sẽ không buộc tiết kiệm trên HD. Bạn đã cố tắt tính năng ghi bộ nhớ đệm trên đĩa chưa? http://support.microsoft.com/kb/259716 – Wojteq
Khi không có bất kỳ lời giải thích nào khác, tôi sẽ chấp nhận câu trả lời này là giải pháp cho thời gian này. – BrokenGlass