2010-04-20 10 views
6

क्या XMLDocument.Save() का उपयोग करके बनाई गई फ़ाइलों के लिए कोई अन्य प्रक्रिया निगरानी है क्या आंशिक फ़ाइल का सामना करना पड़ सकता है? यदि सेव() मौजूदा फाइल को ओवरराइट कर रहा है तो क्या इससे कोई फर्क पड़ता है?XMLDocument है। एक परमाणु ऑपरेशन बचाओ?

उत्तर

7

यदि आप इस तरह से बचाते हैं तो आपको कोई समस्या नहीं होनी चाहिए।

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 
{ 
    xmlDoc.Save(file); 
} 
+0

मुझे लगभग 3 सेकंड तक पंच पर मारो। एक अपवित्र है :) –

2

मुझे नहीं लगता कि परमाणु की कोई गारंटी है। आपको इस पर निर्भर नहीं होना चाहिए।

+0

बदले में एक temp फ़ाइल को सहेजने और फिर इसे नाम बदलने के बारे में क्या? क्या नाम परमाणु रूप से किया जा सकता है, या फाइल सिस्टम इस तरह से काम नहीं करता है? –

+0

मुझे लगता है कि एक नाम नौकरी करेगा। यह इस बात पर निर्भर करता है कि आप कितनी "गारंटी" चाहते हैं। यदि आप एक "असली" गारंटी चाहते हैं, तो आप एक बयान के लिए दस्तावेज देखना चाहते हैं कि ऑपरेशन परमाणु है। आपको Win32 कॉल करने के लिए यह देखने के लिए रिफ्लेक्टर का उपयोग करके .NET कोड को देखने की आवश्यकता हो सकती है, फिर शोध करें कि वे कॉल परमाणु हैं या नहीं। अन्यथा, यह शायद यह समझने के लिए पर्याप्त है कि एक ही मात्रा में एक निर्देशिका से दूसरे नाम का नाम वास्तव में एक नई निर्देशिका प्रविष्टि बनाता है और पुराने को हटा देता है। जटिल नहीं है, और संभवतः परमाणु। –

2

लेखन फाइल सामान्य रूप से परमाणु नहीं है। ओएस का खुलासा करने के बारे में एक विचार प्राप्त करने के लिए Process Monitor देखें।

XmlDocument.Save (स्ट्रिंग) फ़ाइलशेयर का उपयोग करता है। पढ़ें। कैओसपैंडियन का समाधान फाइलशेयर निर्दिष्ट करता है।। अंतर के लिए एमएसडीएन पर System.IO.FileShare देखें।

0

यह उत्तर https://stackoverflow.com/a/487198/1429390 AFAIK को उपयोग में आसान फैशन में किसी प्रकार की परमाणु प्रदान करता है। सिद्धांत एक अस्थायी फ़ाइल में लिखना है और कॉलर को निकट समय पर फ़ाइल (और जो कुछ भी आप चाहते हैं) का नाम बदलने का अवसर प्रदान करते हैं। इस तरह, फ़ाइल बनाने और भरने के दौरान जो भी हो सकता है, संभवतः मौजूदा फ़ाइल को बंद नहीं कर सकता है।

अद्यतन: सिवाय इसके कि यह नहीं है क्योंकि System.IO.File.Move() ओवरराइट करने से इंकार कर देता है। एक कामकाज के लिए https://stackoverflow.com/a/10305475/1429390 देखें।

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