2011-01-31 10 views
5

Bir dizinde değişiklik aramanın güvenilir bir yolunu arıyorum.Bir çerçevedeki dosya değişikliklerini denetlemek için .NET framework

FileSystemWatcher'ı kullanmayı denedim, ancak birçok küçük dosya oluşturulduğunda, değiştirildiğinde veya silindiğinde oldukça yanlıştır. Testlerimdeki dosyaların yaklaşık% 1 veya 2'sini özlüyor. Binlerce dosyayı hızla eklediğinizde veya değiştirdiğinizde bu oldukça fazladır.

Farklı aralıklarla 500 ms, 2000 ms vb. Değişiklikler için sorgulamayı denedim. Bu durumda çok fazla isabet alıyorum. Bu FileInfo nesnesinde zaman damgalarının çözünürlüğü ile bir ilgisi olabilir.

Benim sorum; Bir dizinde yapılan değişiklikleri güvenilir bir şekilde almak için .NET Framework'ü kullanmak mümkün müdür?

- Hıristiyan

cevap

7

InternalBufferSize'u artırmayı denediniz mi? Bunu hangi boyuta ayarladınız? MSDN itibaren

: tampon boyutu aşıldı olduğunda FileSystemWatcher bir olay kaçırabileceği


Not. Eksik olayları önlemek için, aşağıdaki yönergeleri izleyin: arabellek boyutunu InternalBufferSize özelliğini ayarlayarak artırın. Dosyaları uzun dosya adlarıyla izlemek, uzun dosya adı arabellek doldurmak için katkıda bulunduğundan, kaçının. Bu dosyaları daha kısa adlarını kullanarak yeniden adlandırma düşünün.


mümkün olduğunca kısa olay işleme kodu tutun.

+0

Teşekkürler, bu benim için şimdiki sorunlarımı çözüyor. Dosyaları 64 KB'lık bir arabelle özleyemiyorum, en uygun ayarları bulmak için birkaç test daha yapmalı. –

4

Evet, doğru izleme dosya sistemi filtre sürücüsü kullanılarak gerçekleştirilir. Bu tür bir sürücü, gönderildikleri zaman dosya sistemine giden tüm istekleri keser (dosya sistemine ulaşmadan önce veya sonra). Bu sayede tüm bildirimleri alırsınız, tam zamanında (veya olay gerçekleşmeden önce) ve hangi isteklerin geçtiğini ve hangi bilgilerin istekle iletildiğini kontrol edebilirsiniz.

Bu tür bir filtre sürücüsünü kendiniz yazabilirsiniz (~ 6-9 çalışma ayını doğru bir şekilde uygulamak için, ardından test için çok fazla zaman) veya CallbackFilter ürünümüzü kullanabilir ve çekirdek modu gelişimini önleyebilirsiniz. CallbackFilter, .NET, VCL ve native C++ için önceden oluşturulmuş bir sürücü ve API'ler sunar.

+1

Eugene önerisi için teşekkür ederim, hurdaya çıkarılmış bir proje için araştırma yaparken daha önce CallbackFilter'ınıza baktım. Bu bir hobi projesi, bu yüzden şimdilik basit kalmam gerekiyor. Ancak aklınızda bulundurun;) –

+3

@Eugene: Bu yanıt bir kaç kullanıcı tarafından spam olarak işaretlendi. Bunun olduğuna inanmıyorum, çünkü (bölgede uzman olmamasına rağmen) ürününüzün aslında * sorununa bir çözüm getirdiği anlaşılıyor. Bununla birlikte, gelecekte kendi ürününü tanıtmak için bunu biraz daha açık hale getirmeyi düşünebilirsiniz. Belki de altta bir şey ya da bir şey. Ve downvotes karşı +1. –

+1

@Cody Gray - "bizim ... ürünümüz" ibaresi, kullanıcı adıyla birlikte oldukça açık bir şekilde, benim için olduğu gibi, ve bu daha önce (hem Meta üzerinde tartışılan hem de burada test edilmiş) ele alınmış ve kabul edilmiştir. –

İlgili konular