2010-10-06 8 views
7

पर पूरी तरह से लिखा जाने का इंतजार है, मैं इसमें फाइलें बनाने के लिए फ़ोल्डर देखने के लिए pyinotify का उपयोग कर रहा हूं। और जब कुछ फाइलें बनाई जाती हैं तो मैं उन्हें स्थानांतरित करना चाहता हूं। समस्या यह है कि जैसे ही फ़ाइल बनाई गई है (जाहिर है), मेरा प्रोग्राम डिस्क पर पूरी तरह से लिखा जाने से पहले भी इसे स्थानांतरित करने का प्रयास करता है।फ़ाइल निर्माण के लिए देखने के लिए pyinotify का उपयोग करना, लेकिन इसे डिस्क

क्या कोई फ़ाइल पूरी तरह से डिस्क पर लिखी गई है जब तक यह मुझे सूचित करने से पहले फ़ाइल को पूरी तरह से लिखा गया है? या क्या मुझे कोई अधिसूचित तरीका है, जब मुझे अधिसूचित किया गया है, तो जब तक यह लिखा नहीं जाता है तब तक पाइथन इसे स्थानांतरित करने के लिए प्रतीक्षा करें?

उत्तर

14

pyinotify IN_CLOSE_WRITE घटनाओं पर प्रतिक्रिया है:

wm.add_watch(watched_dir, pyinotify.IN_CLOSE_WRITE, proc_fun=MyProcessEvent()) 

यह man 5 incrontab से है, लेकिन यह भी समान रूप से pyinotify पर लागू होता है:

IN_ACCESS   File was accessed (read) (*) 
    IN_ATTRIB   Metadata changed (permissions, timestamps, extended attributes, etc.) (*) 
    IN_CLOSE_WRITE  File opened for writing was closed (*) 
    IN_CLOSE_NOWRITE File not opened for writing was closed (*) 
    IN_CREATE   File/directory created in watched directory (*) 
    IN_DELETE   File/directory deleted from watched directory (*) 
    IN_DELETE_SELF   Watched file/directory was itself deleted 
    IN_MODIFY   File was modified (*) 
    IN_MOVE_SELF  Watched file/directory was itself moved 
    IN_MOVED_FROM  File moved out of watched directory (*) 
    IN_MOVED_TO   File moved into watched directory (*) 
    IN_OPEN    File was opened (*) 
+1

ध्यान दें कि यह संशोधनों को पकड़ लेगा, साथ ही रचनाएं (यदि आप उस निर्देशिका को प्रतिबिंबित कर रहे हैं जो वांछित व्यवहार हो)। यदि आप केवल * नई * फ़ाइलों का पता लगाने पर ट्रिगर करना चाहते हैं, तो आपको एक कस्टम हैंडलर की आवश्यकता होगी जो 'IN_CREATE' ईवेंट ट्रैक करता है और फिर उन्हें समाप्त करने की प्रतीक्षा करता है ('IN_CLOSE_WRITE' ईवेंट भी देखकर)। – TimStaley

1

यदि फ़ाइल को लिखा जा रहा है तो इस स्तर पर बताना मुश्किल है। आप क्या कर सकते हैं यह देखने के लिए परीक्षण है कि किसी अन्य प्रक्रिया द्वारा फ़ाइल खोला गया है या नहीं।

1) फ़ाइल खोलते समय उपयोग किए जाने वाले विभिन्न झंडे से, O_EXLOCK ध्वज सहायता का हो सकता है। यदि O_EXLOCK ध्वज सेट किया गया है, तो फ़ाइल डिस्क्रिप्टर फ़ाइल पर एक विशेष लॉक है। तो मेरी समझ यह है कि यदि आप os.EXLOCK ध्वज के साथ os.open() कर सकते हैं, तो यह अन्य प्रक्रिया द्वारा नहीं खुलता है। यह सभी पॉज़िक्स संगत ओएस पर काम करना चाहिए लेकिन मैंने इसका परीक्षण नहीं किया है। अगर फ़ाइल खुली है तो आप फिर से बंद कर सकते हैं, प्रतीक्षा कर सकते हैं और पुनः प्रयास कर सकते हैं।

2) आप os.stat को भी आजमा सकते हैं और बदलते समय टिकट देख सकते हैं और जानकारी को सुरक्षित रूप से समझने का प्रयास कर सकते हैं। हालांकि यह मूर्ख प्रमाण नहीं है।

3) यूनिक्स सिस्टम पर, आप "lsof"

4 कोशिश कर सकते हैं) निम्नलिखित पृष्ठ से सिमलिंक के उपयोग का वर्णन करता है/proc/पीआईडी ​​/ fd खुली फ़ाइलों

[संपादित करें: लिंक अद्यतन]

1

आप लेखन की प्रक्रिया का नियंत्रण है, तो , जब आप इसे बंद कर दिया गया है तो इसे "foo.part" फ़ाइल पर कॉल किया जा सकता है और इसे "foo" पर पुनर्नामित किया जा सकता है।

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