2013-03-07 5 views
8

मैं सी # का उपयोग करके एक विशाल टेक्स्ट फ़ाइल उत्पन्न करने की कोशिश कर रहा हूं और दूसरी प्रक्रिया लगातार स्थान को देख रही है और उपलब्ध होने पर फ़ाइल को लेने का प्रयास कर रही है। इस पड़ता हैफ़ाइल। मेट्रो परमाणु ऑपरेशन

1 - Write to file : Filename_temp.txt 
2 - Check if Filename.txt already exists then Delete 
3 - Do a File.Move to the same destination  
    From filename : Filename_temp.txt 
    TO : Filename.txt 

के बाद से सी # एक नाम बदलने की जरूरत नहीं है, मैं File.Move का सहारा लेना पड़, यकीन है कि इस कदम आपरेशन परमाणु होगा:

आदेश फ़ाइल नीचे परमाणु बनाने के लिए कदम उठाए जाते हैं या इस परमाणुता को हासिल करने का कोई और तरीका है?

+1

आप कहकर * बिल्कुल * मतलब क्या कहते हैं: परमाणु चाल? – Tigran

+0

क्या आप दोनों अनुप्रयोग तर्क अपडेट कर सकते हैं? यदि हां - पहुंच – sll

+0

को सिंक करने के लिए म्यूटेक्स का उपयोग करें, तो मैं अस्तित्व की जांच करने और पहले हटाने की सलाह देता हूं। आप कभी नहीं जानते, जब 'filename_temp.txt' पहले से मौजूद हो सकता है। – Nolonar

उत्तर

12

देखें MSDN ब्लॉग लेख How to do atomic writes in a file के अनुसार, नाम बदलने में कोई NTFS फ़ाइल एक परमाणु ऑपरेशन है:

समाधान? चलो याद रखें कि मेटाडाटा परिवर्तन परमाणु हैं। नाम बदलें ऐसा मामला है। इसलिए, हम केवल एक अस्थायी फ़ाइल में लिख सकते हैं, और जब हम जानते हैं कि लिखने डिस्क पर (पूर्ण और फ़्लश किए गए हैं) तो हम पुरानी फ़ाइल को नई फ़ाइल के साथ बदल सकते हैं।

दी, इस कि File.Move सिर्फ एक NTFS का नाम बदलने के आपरेशन के मुद्दों की गारंटी नहीं है, लेकिन मैं एक वैध कारण है कि यह कुछ भी और अधिक जटिल क्या करना चाहिए के बारे में सोच नहीं कर सकते।

+6

निश्चित रूप से एक कारण है: फ़ाइल को किसी भिन्न डिवाइस पर ले जाया जा सकता है। – PythonNut

3

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

http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspx पर एमएस कर्मचारी से एक एफएक्यू से हमारे पास है;

'अक्सर पूछे जाने वाले प्रश्न: क्या MovFileEx परमाणु है यदि मौजूदा और नई फ़ाइलें एक ही ड्राइव पर हैं?

सरल उत्तर "आमतौर पर है, लेकिन कुछ मामलों में यह चुपचाप एक गैर-परमाणु विधि में गिर जाएगा, इसलिए इस पर भरोसा न करें"।

मुझे लगता है कि यह 100% महत्वपूर्ण है तो आप ट्रांजेक्शन एनटीएफएस देख सकते हैं। मुझे यकीन नहीं है कि इसमें अभी तक नेट में रैपर हैं या नहीं, इसलिए आपको पी/आमंत्रण का उपयोग करने की आवश्यकता हो सकती है।

+0

बिल्कुल, क्या यह कहीं दस्तावेज है? –

+0

इस समय कुछ भी नहीं मिल रहा है, हालांकि यह नेट की बजाय एनटीएफएस की एक विशेषता है। संदर्भ खोजने की कोशिश करेंगे। –

+0

+1। इस बिंदु पर माइक्रोसॉफ्ट * से स्रोतों का विरोधाभास प्रतीत होता है। – Heinzi

1

यह सी # या नेट फ्रेमवर्क की बजाय विंडोज़ की एक विशेषता है।

यहाँ

Atomicity of File.Move

0

आप अपनी फ़ाइल सीधे गंतव्य पर लिख सकते हैं और एक बड़ी आकार की सिग्नल फ़ाइल का उपयोग कर सकते हैं जो आपके द्वारा बड़ी फ़ाइल तैयार होने के बाद बनाई गई है। आपकी पाठक प्रक्रिया सिग्नल फ़ाइल की तलाश कर सकती है और सिग्नल फ़ाइल उपलब्ध होने के बाद एक बड़ी फाइल पढ़ सकती है। मुझे लगता है कि "परमाणु" समस्या को हल कर सकते हैं।

+0

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

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