2012-04-24 11 views
6

File.Move के प्रलेखन से:नकल File.Move यदि गंतव्य पहले से मौजूद है

ध्यान दें कि यदि आप उस निर्देशिका में एक ही नाम के एक फ़ाइल को ले जाकर एक फ़ाइल को बदलने के प्रयास करते हैं, तो आप एक IOException मिलता है। आप किसी मौजूदा फ़ाइल को ओवरराइट करने के लिए मूव विधि का उपयोग नहीं कर सकते हैं।

संक्षेप में, आप Move पर ओवरराइट नहीं कर सकते, इसलिए क्रम में ले जाएँ मैं एक File.Copy एक File.Delete द्वारा पीछा करके व्यवहार की नकल पर अधिलेखन की सुविधा के लिए। कुछ की तरह:

if (File.Exists(dstFileName)) 
{ 
    // System.IO.File.Move cannot be used to overwrite existing files, so we're going 
    // to simulate that behavior with a Copy & Delete. 
    File.Copy(procContext.FileName, dstFileName); 
    File.Delete(procContext.FileName); 
} 
else 
    File.Move(procContext.FileName, dstFileName); 

मेरा प्रश्न है: क्या कोई स्थितियों है कि मैं जो से बचने के लिए की जरूरत है स्रोत फ़ाइल का नेतृत्व कर सकेगी बिना यह पहली बार सफलतापूर्वक कॉपी किया जा रहा नष्ट कर दिया जा रहा है?

प्रलेखन पढ़ने से मेरी समझ यह है कि File.Copy किसी भी मामले में अपवाद फेंकने के बाद से कुछ भी वापस नहीं लौटाता है कि यह सफल नहीं होता है। क्या किसी ने किसी भी परिस्थिति का सामना किया है जहां यह सच नहीं है?

+3

नहीं यह द्वारा पीछा किया, एक लक्ष्य फ़ाइल पर हटाना यदि वह मौजूद है ऐसा करने के लिए सुरक्षित होगा शुरुआत में आपके जैसे कदम क्या थे? – Tudor

+0

@ ट्यूडर - जरूरी नहीं। यदि चाल विफल हो जाती है, तो मूल गंतव्य फ़ाइल भी चली जाएगी जो वास्तव में अपेक्षित व्यवहार नहीं है। –

+0

लेकिन आपके प्रश्न से मैं यह समझता हूं कि यदि ड्राइव में मौजूद होने पर आपको फ़ाइल को ओवरराइट करने की अनुमति दी जाती है, तो आप इसे कॉपी + डिलीट करने के बजाय उपयोग करेंगे। तो मुझे लगता है कि आप उस जोखिम को लेने के इच्छुक हैं? – Tudor

उत्तर

7

मेरा सुझाव है कि यदि आप लक्ष्य फ़ाइल मौजूद हैं और यदि हां, तो इसे हटाएं। फिर एक सामान्य चाल ऑपरेशन निष्पादित करें।

चूंकि यह अनुक्रम परमाणु नहीं है, यदि गंतव्य मौजूद है, तो आप इसे हटाने के बजाए इसका नाम बदलना चाहेंगे, इससे आगे बढ़ने के मामले में इसे खोने से बचने के लिए।

+0

आपकी मदद के लिए फिर से धन्यवाद। –

+1

हालांकि, यह एक परमाणु ऑपरेशन नहीं है। अर्थात। अगर हम हटाने के बीच में हैं और उस फ़ाइल को ले जा रहे हैं और बिजली विफलता होती है, तो हमने सामग्री खो दी है। यह काल्पनिक नहीं है, लेकिन हमारे अनुप्रयोगों में से एक के साथ एक वास्तविक समस्या है। File.Replace() के बजाय नीचे दिए गए उत्तर को देखें, – Seven

+0

यदि अधिकांश लोग इस प्रश्न पूछ रहे हैं, तो आपको परमाणुता की आवश्यकता है, [आर्सेन ज़हर के उत्तर] (http://stackoverflow.com/a/21882993/429091) देखें। – binki

2

यह सुरक्षित है। File.Copy या तो पूरी तरह सफल हो जाएगा या फेंक देगा। बेशक, हटाए गए स्रोत फ़ाइल को कचरा के रूप में छोड़ने में विफल हो सकता है।

यदि आपका कंप्यूटर दुर्घटनाग्रस्त हो जाता है, हालांकि, इस बात की कोई गारंटी नहीं है कि कॉपी ऑपेशन ने अभी तक डेटा को कठोर कर दिया है। आप उस मामले में डेटा खो सकते हैं।

सामान्य परिचालन के दौरान यह सुरक्षित है।

3

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

उसी डिस्क के मामले में, Delete + Move कुछ हद तक सुरुचिपूर्ण (तेज़ और सुरक्षित) है क्योंकि यह वास्तव में डेटा को किसी भी तरह से नहीं भरता है। आप आगे

try 
{ 
    Move(dest, tmp); 
    Move(src, dest); 
    Delete(tmp); 
} 
catch 
{ 
    try 
    { 
     Move(tmp, dest); 
    } 
    catch 
    { 
    } 
    throw; 
} 

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

एक परिदृश्य में जहाँ में आप नहीं जानते कि यह एक ही डिस्क है, आपका समाधान पर्याप्त सुरक्षित और काफी सरल है। हालांकि, यह एक ही डिस्क के भीतर भी डेटा की प्रतिलिपि बनाता है, जिससे आप बिजली की विफलता के जोखिम की एक विस्तृत खिड़की लाते हैं।

0

फ़ाइल "लक्ष्य" Exsists फ़ाइल की जांच करें। यदि नहीं, तो अपनी फ़ाइल कॉपी करें।

यदि हां: temp dir को "लक्ष्य" ले जाएं, जहां आप सुनिश्चित हो सकते हैं कि यह कदम सफल होगा। आप एक यूडीआईडी ​​नाम के साथ टेम्प में एक उपदिर उत्पन्न कर सकते हैं। फिर अपनी फाइल कॉपी करें।

5

यह

File.Replace(source, destination, copy) 

वह मेरे लिए काम कर देता है कॉल करने के लिए किया जाएगा करने के लिए सही तरीका

+0

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

+1

हां, यह एक परमाणु (या कम से कम लेनदेन) ऑपरेशन प्रतीत होता है। Https://social.msdn.microsoft.com/forums/vstudio/en-US/848ce6b7-ce52-43ca-b79b-168835837c63/is-filereplace-atomic-on-an-ntfs-filesystem – Seven

+0

ओह, तो * यह देखें * क्या है। नाम पर 'rename()' कहा जाता है। – binki