2012-10-10 9 views
5

मैं एक पायथन स्क्रिप्ट को अलर्ट करने का एक तरीका समझना चाहता हूं कि एक फ़ाइल प्रतिलिपि बनाई गई है।पाइथन में फ़ाइल की प्रतिलिपि बनाई जाने पर आप कैसे जांचते हैं?

  1. एक फ़ोल्डर to_print लगातार os.listdir() साथ मतदान से स्क्रिप्ट के द्वारा देखा जा रहा है: यहाँ परिदृश्य है।

  2. हर बार os.listdir() फ़ाइलों की एक सूची देता है जिसमें एक फ़ाइल मौजूद है जो पहले नहीं देखी गई है, लिपि उस फ़ाइल पर कुछ संचालन करती है, जिसमें इसे खोलना और इसकी सामग्री में हेरफेर करना शामिल है।

यह जब फ़ाइल छोटा है, और निर्देशिका के लिए अपनी मूल स्रोत से फ़ाइल की प्रतिलिपि बनाते देखा जा रहा os.listdir() द्वारा अगले चुनाव तक लगने वाले समय का कम से कम समय लगता है ठीक है। हालांकि, अगर एक फ़ाइल को पराजित और पाया जाता है, लेकिन यह अभी भी कॉपी होने की प्रक्रिया में है, तो जब फ़ाइल स्क्रिप्ट पर कार्य करने की कोशिश करता है तो फ़ाइल सामग्री दूषित होती है।

इसके बजाय, मैं (os.stat या अन्यथा) का उपयोग करने में सक्षम होना चाहता हूं) पता है कि वर्तमान में एक फ़ाइल की प्रतिलिपि बनाई जा रही है, और जब तक मैं ऐसा नहीं करता तब तक इसे करने के लिए प्रतीक्षा करें।

मेरा वर्तमान विचार os.stat() का उपयोग हर बार जब मुझे एक नई फ़ाइल मिलती है, तो अगले चुनाव तक प्रतीक्षा करें और आखिरी बार मतदान के बाद से संशोधित/निर्मित समय की तारीख की तुलना करें, और यदि वे वही रहते हैं तो वह फ़ाइल है "स्थिर", अन्यथा मतदान होने तक मतदान जारी रखें। मुझे यकीन नहीं है कि यह काम करेगा हालांकि मैं इस बात से परिचित नहीं हूं कि लिनक्स/यूनिक्स इन मानों को कैसे अपडेट करता है।

उत्तर

1

चूंकि फाइलों को मतदान अंतराल के भीतर कॉपी किया जा सकता है, इसलिए नई फ़ाइलों की जांच करने से पहले अंतिम सर्वेक्षण द्वारा प्राप्त नई फ़ाइलों को संसाधित करें। दूसरे शब्दों में, बजाय इस बात का में:

while True: 
    newfiles = check_for_new_files() 
    process(newfiles) 
    time.sleep(pollinterval) 

यह करें:

newfiles = [] 

while True: 
    process(newfiles) 
    newfiles = check_for_new_files() 
    time.sleep(pollinterval) 

या बस (वास्तव में एक ही प्रभाव) पाश के बीच में इंतजार कर दिया:

while True: 
    newfiles = check_for_new_files() 
    time.sleep(pollinterval) 
    process(newfiles) 
+0

यह अगर वहाँ पर कार्रवाई करने के लिए कोई फ़ाइल कर रहे हैं और निर्देशिका खाली है काम नहीं करेगा। – emish

+0

@emish, क्यों नहीं? 'Newfiles' सिर्फ खाली सूची नहीं होगी, और निश्चित रूप से 'प्रक्रिया' एक खाली सूची को समझदारी से संभाल सकता है। (यदि यह नहीं कर सकता है, तो इसे समायोजित किया जाना चाहिए ताकि यह कर सके।) – huon

+0

@kindall मेरी माफ़ी। जब तक मैंने कोशिश नहीं की तब तक मुझे अंतर का एहसास नहीं हुआ। धन्यवाद, यह बिल्कुल छोटा हैक मुझे चाहिए! – emish

2

inotify आज़माएं।

यह फाइल देखने के लिए एक लिनक्स मानक है। आपके उपयोग के मामले में ईवेंट IN_CLOSE_WRITE आशाजनक प्रतीत होता है। Python library for inotify है। एक बहुत ही सरल उदाहरण (there से लिया गया)। आपको केवल IN_CLOSE_WRITE ईवेंट को पकड़ने के लिए इसे संशोधित करने की आवश्यकता होगी।

# Example: loops monitoring events forever. 
# 
import pyinotify 

# Instanciate a new WatchManager (will be used to store watches). 

wm = pyinotify.WatchManager() 
# Associate this WatchManager with a Notifier (will be used to report and 
# process events). 

notifier = pyinotify.Notifier(wm) 
# Add a new watch on /tmp for ALL_EVENTS. 
wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # <-- replace by IN_CLOSE_WRITE 

# Loop forever and handle events. 
notifier.loop() 

यहाँ एक व्यापक API दस्तावेज़ है: http://seb-m.github.com/pyinotify/

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