2009-06-23 19 views
5

मेरे पास स्रोत फ़ोल्डर का एक सेट है। मैं इन फ़ोल्डर्स से वितरण फ़ाइल बनाने के लिए जावा क्लास का उपयोग करता हूं। मैं जावा में एक और छोटी कक्षा लिखना चाहता हूं जो हर आधा सेकेंड चलाता है, जांचता है कि फ़ोल्डरों में से कोई भी फाइल बदल गई है, और यदि हां, तो बिल्डिंग क्लास चलाएं।जावा में किसी फ़ोल्डर में बदलाव को ट्रैक करने का सबसे आसान तरीका क्या है?

तो, मैं आसानी से कैसे पता लगा सकता हूं कि एक फ़ोल्डर को संशोधित किया गया है?

उत्तर

4

मुझे लगता है कि आपको निर्देशिका और उपनिर्देशिका मोडफिकेशन समय (फ़ाइलों को जोड़ने/निकालने के लिए) और फ़ाइल संशोधन समय (प्रत्येक फ़ाइल में परिवर्तन के लिए) की जांच करने की आवश्यकता होगी।

एक पुनरावर्ती दिनचर्या लिखें जो इसके संशोधन समय के लिए निर्देशिका की जांच करता है और यदि यह बदल जाता है, साथ ही प्रत्येक फाइल भी। फिर निर्देशिका सामग्री की जांच करता है, और किसी भी उपनिर्देशिका के लिए पुनरावर्ती कॉल करें। जब आप आखिरी बार चेक चलाते हैं तो आपको बस किसी भी संशोधन समय की जांच करनी चाहिए।

देखें File.lastModified()

संपादित करें: जब से मैं ने लिखा है इसके बाद के संस्करण, जावा 7 अपने directory watching capability साथ बाहर आया था।

2

यदि आप को जावा 7 का उपयोग करने की अनुमति है, तो प्लेटफार्म स्वतंत्र निर्देशिका/फ़ाइल परिवर्तन अधिसूचनाओं के लिए इसका समर्थन है।

जेएनए में क्रॉस प्लेटफ़ॉर्म परिवर्तन अधिसूचना here के लिए नमूना है। सुनिश्चित नहीं है कि आपको यह कितना आसान लगेगा।

1

मुझे नहीं पता कि यह कोई अच्छा है, लेकिन here's समस्या पर एक व्यक्ति का लेना है।

ध्वनि नेट कुछ में निर्मित है की तरह: FileSystemWatcher

अद्यतन: kd304 के लिए धन्यवाद, मैं सिर्फ सीखा है कि जावा 7 same feature होगा। आज तक आप बहुत अच्छा नहीं करेंगे, जब तक आप preview release का उपयोग नहीं कर सकते।

0

एनआईओ 2 (जावा 7) के साथ यह बहुत आसान होगा। जावा 6 के साथ आप सूची() को कॉल कर सकते हैं और दूसरी बार एक बार पिछली सूची के साथ तुलना कर सकते हैं? (एक गरीब आदमी देख सेवा)

1

आप घड़ी प्रत्येक फ़ाइल की जरूरत है और File.lastModified विशेषता का ट्रैक रखने और निर्देशिका संरचना चलने के लिए सरल प्रत्यावर्तन का एक सा के साथ एक साथ File.exists ध्वज की जाँच करें।

0

हां, निर्देशिकाओं के लिए कई उपलब्ध श्रोताओं हैं, लेकिन वे सभी अपेक्षाकृत जटिल हैं और अधिकांश धागे शामिल हैं।

कुछ दिन पहले मैं क्या यह एक अनुमेय था एक नया धागा (एक वेब अनुप्रयोग में) बनाने के लिए बस एक निर्देशिका वृक्ष नजर रखने के लिए हमारे इंजीनियरों में से एक के साथ एक लगभग गहन विचार-विमर्श में समाप्त हो गया। अंत में मैं उसके साथ सहमत हुआ, लेकिन इतनी तेजी से आने के आधार पर कि श्रोता होने के कारण अनावश्यक है। नोट: नीचे वर्णित समाधान केवल काम करता है यदि आपको जानने की आवश्यकता नहीं है जो फ़ाइल बदल गई है, केवल फ़ाइल बदल गई है।

आप फ़ाइलों का संग्रह (उदा।, Apache IO की FileUtils.listFiles() विधि के माध्यम से प्राप्त किया गया है) और यह संग्रह के लिए हैश देता है। अगर कोई फ़ाइल जोड़ दी जाती है, हटा दी जाती है, या इसकी संशोधन तिथि बदल जाती है, तो हैश बदल जाएगा।

मेरे परीक्षणों में, 50K फ़ाइलों को 3 जीएचज़ लिनक्स बॉक्स पर लगभग 750ms लगता है। किसी भी फाइल को छूने से हैश बदल जाता है। अपने स्वयं के कार्यान्वयन में मैं एक अलग हैश एल्गोरिदम (डीजेबी) का उपयोग कर रहा हूं जो थोड़ा तेज़ है लेकिन यह इसका सारांश है। अब हम सिर्फ हैश स्टोर करते हैं और हर बार जांचते हैं क्योंकि यह बहुत दर्द रहित है, खासकर छोटे फ़ाइल संग्रहों के लिए। यदि कुछ भी बदलता है तो हम निर्देशिका को फिर से अनुक्रमित करते हैं। एक दर्शक की जटिलता हमारे आवेदन में बस इसके लायक नहीं थी।

/** 
* Provided a directory and a file extension, returns 
* a hash using the Adler hash algorithm. 
* 
* @param files the Collection of Files to hash. 
* @return  a hash of the Collection. 
*/ 
public static long getHash(Collection<File> files) 
{ 
    Adler32 adler = new Adler32(); 
    StringBuilder sb = new StringBuilder(); 
    for (File f : files) { 
     String s = f.getParent()+'/'+f.getName()+':'+String.valueOf(f.lastModified()); 
     adler.reset(); 
     adler.update(s.getBytes()); 
     sb.append(adler.getValue()+' '); 
    } 
    adler.reset(); 
    adler.update(sb.toString().getBytes()); 
    return adler.getValue(); 
} 

और हाँ, सुधार के लिए जगह है (उदाहरण के लिए, हम इसे जोड़ने के बजाय हैश विधि का उपयोग करते हैं)। उपरोक्त हमारे वास्तविक कोड से काटा गया है लेकिन आपको एक अच्छा विचार देना चाहिए कि हमने क्या किया।

संबंधित मुद्दे

 संबंधित मुद्दे