ऐसा करने का कोई तरीका नहीं है; फ़ाइल कॉपी ऑपरेशन कभी परमाणु नहीं होते हैं और उन्हें बनाने का कोई तरीका नहीं है।
लेकिन आप फ़ाइल को यादृच्छिक, अस्थायी नाम के तहत लिख सकते हैं और फिर का नाम बदल सकते हैं। नाम बदलें नाम परमाणु होना चाहिए। यदि फ़ाइल पहले से मौजूद है, तो नाम विफल हो जाएगा और आपको एक त्रुटि मिलेगी।
[EDIT2]rename()
केवल परमाणु है अगर आप एक ही फाइल सिस्टम में करते हैं। सुरक्षित तरीका गंतव्य के समान फ़ोल्डर में नई फ़ाइल बनाना है।
[संपादित करें] बहुत सी चर्चा है कि नाम हमेशा परमाणु है या नहीं और ओवरराइट व्यवहार के बारे में है। तो मैंने कुछ संसाधन खोद दिए।
लिनक्स पर, यदि गंतव्य मौजूद है और स्रोत और गंतव्य दोनों फाइलें हैं, तो गंतव्य चुपचाप ओवरराइट किया गया है (man page)। तो मैं वहां गलत था।
लेकिन rename(2)
अभी भी गारंटी देता है कि मूल फ़ाइल या नई फ़ाइल वैध होने पर मान्य रहती है, इसलिए ऑपरेशन इस परमाणु है कि यह डेटा दूषित नहीं कर सकता है। यह इस अर्थ में परमाणु नहीं है कि यह दो प्रक्रियाओं को एक ही समय में एक ही नाम बदलने से रोकता है और आप परिणाम की भविष्यवाणी कर सकते हैं। एक जीत जाएगा लेकिन आप कौन नहीं बता सकते हैं।
विंडोज़ पर, यदि कोई अन्य प्रक्रिया वर्तमान में फ़ाइल लिख रही है, तो यदि आप इसे लिखने के लिए खोलने का प्रयास करते हैं तो आपको एक त्रुटि मिलती है, इसलिए विंडोज के लिए एक फायदा।
यदि आपका कंप्यूटर डिस्क पर ऑपरेशन के दौरान क्रैश हो जाता है, तो फ़ाइल सिस्टम का कार्यान्वयन यह तय करेगा कि डेटा कितना दूषित हो जाता है। कुछ भी कोई एप्लिकेशन इसके बारे में नहीं कर सकता है। तो पहले से ही रोना बंद करें :-)
कोई अन्य दृष्टिकोण भी नहीं है जो बेहतर काम करता है या साथ ही साथ यह भी।
आप इसके बजाय फ़ाइल लॉकिंग का उपयोग कर सकते हैं। लेकिन इससे सबकुछ अधिक जटिल हो जाएगा और कोई अतिरिक्त लाभ नहीं मिलेगा (इसके अलावा कुछ जटिल होने के अलावा कुछ लोग किसी कारण से बड़े लाभ के रूप में देखते हैं)। और जब आप अपनी फ़ाइल नेटवर्क ड्राइव पर हों तो आप बहुत अच्छे कोने के मामले जोड़ देंगे।
आप open(2)
मोड O_CREAT
के साथ उपयोग कर सकते हैं जो फ़ाइल को पहले से मौजूद होने पर फ़ंक्शन विफल कर देगा। लेकिन यह फ़ाइल को हटाने और अपनी प्रतिलिपि लिखने की दूसरी प्रक्रिया को रोक नहीं पाएगा।
या निर्देशिका बनाने के बाद से आप लॉक निर्देशिका बना सकते हैं, साथ ही साथ परमाणु होना चाहिए। लेकिन वह आपको ज्यादा खरीद नहीं करेगा, या तो। आपको लॉकिंग कोड स्वयं लिखना होगा और बिल्कुल सही बनाना होगा, 100% सुनिश्चित करें कि आप वास्तव में, आपदा के मामले में वास्तव में हमेशा लॉक निर्देशिका को हटा दें - जो आप नहीं कर सकते।
क्या यह केवल गंतव्य का निर्माण है जिसे परमाणु होने की आवश्यकता है, लेकिन स्रोत सामग्री को पढ़ने के रूप में, केवल एक बिंदु-बिंदु का प्रतिनिधित्व करते हैं? –
बस सृजन। मैं एक प्रोग्राम लिख रहा हूं जो ज़ोन फ़ाइल को/tmp पर प्रतिलिपि बनाता है, आवश्यक परिवर्तन करता है, और उसके बाद इसे अंत में कॉपी करता है। मुझे बस यह सुनिश्चित करने की ज़रूरत है कि दो लोग एक ही समय में कोशिश करें और संपादित करें, उनमें से एक अपने परिवर्तनों को खो नहीं देता है। – Rory
ध्यान रखें कि 'नाम बदलें() 'केवल परमाणु है यदि स्रोत और गंतव्य एक ही फाइल सिस्टम पर हैं - तो हो सकता है कि आप गंतव्य निर्देशिका में अपनी अस्थायी फ़ाइल बनाना चाहें, न कि'/tmp' में। –