2012-06-02 8 views
11

फ़ाइल में करने के लिए आवश्यक है?
मैं इसे कभी नहीं करता क्योंकि मैं फ़ाइल को कॉल करता हूं। बंद करो, और मुझे लगता है कि यह स्वचालित रूप से फ़्लश हो गया है, है ना?गो में फ़ाइल को फ़्लश करने के लिए कब?

+0

कोई इसे बंद करना क्यों चाहता था? एक टिप्पणी कृपया? –

+0

आपको क्या लगता है कि .lose() स्वचालित रूप से बाइट्स को स्टोरेज में फ़्लश करता है? [बंद करने का स्रोत यह इंगित नहीं करता है] (https://golang.org/src/os/file_unix.go?s=5591:5619#L179) - क्या मुझे कुछ याद आ रही है? –

उत्तर

12

आप देखेंगे कि एक os.File में कोई नहीं है। फ्लश() क्योंकि इसे किसी की आवश्यकता नहीं है क्योंकि यह buffered नहीं है। इसे लिखने के लिए फ़ाइल को लिखने के लिए सीधा सिस्कोल हैं।

जब आपका प्रोग्राम निकलता है (भले ही यह दुर्घटनाग्रस्त हो) तो सभी फाइलें जो इसे खोलती हैं, ऑपरेटिंग सिस्टम द्वारा स्वचालित रूप से बंद हो जाएंगी और फाइल सिस्टम आपके परिवर्तनों को डिस्क पर लिखने पर लिख देगा (कभी-कभी कुछ मिनट बाद आपका कार्यक्रम निकलता है)।

कॉलिंग os.File.Sync() fsync() syscall को कॉल करेगा जो फ़ाइल सिस्टम को डिस्क पर अपने बफर को फ्लश करने के लिए मजबूर करेगा। यह गारंटी देगा कि आपका डेटा डिस्क पर और लगातार है, भले ही सिस्टम चालू हो या ऑपरेटिंग सिस्टम क्रैश हो।

आप .Sync कॉल करने के लिए की जरूरत नहीं है()

+1

यह उत्तर 'fflyn' के साथ' fsync' को भ्रमित करता है। आपको एक unbuffered फ़ाइल _flush_ करने की आवश्यकता नहीं है। इसका मतलब यह नहीं है कि अगर आपको गारंटी है कि लेखन डिस्क पर प्रतिबद्ध है तो आपको _sync_ की आवश्यकता नहीं है। Piotr Praszmo का जवाब बेहतर है। –

0

जब आप जितना संभव हो सके डेटा अखंडता सुनिश्चित करना चाहते हैं। उदाहरण के लिए, फ़ाइल बंद करने से पहले आपका प्रोग्राम क्रैश होने पर क्या होता है?

10

here देखें। File.Sync()fsync पर syscall है। आपको उस नाम के तहत और अधिक ढूंढने में सक्षम होना चाहिए।

ध्यान रखें कि fsyncfflush जैसा नहीं है और इसे बंद करने से पहले निष्पादित नहीं किया गया है।

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

+2

"आपको आम तौर पर इसे कॉल करने की आवश्यकता नहीं है" जो केवल तभी सच है यदि आप एम्बेडेड डिवाइस पर काम नहीं कर रहे हैं, जहां कोई भी आपकी बिजली आपूर्ति को किसी भी समय डिस्कनेक्ट करने का निर्णय ले सकता है। – Joppe

+0

समस्या केवल एम्बेडेड डिवाइस तक ही सीमित नहीं है। हमेशा एक जोखिम है कि असंसमित लेखन फाइल सिस्टम के इन-मेमोरी बफर के साथ मर जाते हैं, लेकिन आधुनिक पत्रिकाओं वाली फाइल सिस्टम के साथ, वह खिड़की गायब हो जाती है। कुछ बैटरी समर्थित हार्डवेयर स्थिरता को और भी बेहतर बना सकते हैं। 'सिंक' कार्यक्रम को और अधिक जागरूक करने का तरीका है कि अंतर्निहित भंडारण अद्यतित है। –

0

लग रहा है यहाँ सबसे सिफारिशों fsync कॉल करने के लिए नहीं करने के लिए() हैं, लेकिन सामान्य रूप में यह मुख्य रूप से अपने आवेदन की आवश्यकता पर निर्भर करता है। यदि आप महत्वपूर्ण फ़ाइल पढ़ने/लिखने पर काम कर रहे हैं, तो इसे हमेशा fsync() को कॉल करने की अनुशंसा की जाती है।

http://www.microhowto.info/howto/atomically_rewrite_the_content_of_a_file.html#idp31936

लिंक, जब file.Sync() में मदद मिलेगी बारे में अधिक जानकारी नहीं है।

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