2010-04-28 31 views
19

क्या फ़ाइल को स्थानांतरित करने के इन दो तरीकों के बीच कोई अंतर है?FileInfo.MoveTo() बनाम File.Move()

System.IO.FileInfo f = new System.IO.FileInfo(@"c:\foo.txt"); 
f.MoveTo(@"c:\bar.txt"); 

//vs 

System.IO.File.Move(@"c:\foo.txt", @"c:\bar.txt"); 
+1

सवाल क्या है? वे एक ही एपीआई तक पहुंचने के लिए दो अलग-अलग तरीकों से प्रतीत होते हैं। क्या आप लूप प्रदर्शन या सर्वोत्तम प्रथाओं की तलाश में हैं या ??? – jcolebrand

+0

मैं सिर्फ उत्सुक था कि दो विधियां क्यों थीं जो बिल्कुल वही काम करती हैं। –

+0

उम्मीद है कि नीचे दिए गए स्निपेट आपको दिखाएंगे कि वे अलग-अलग कैसे हैं? इसके अलावा, यदि आप लाल गेट से (वर्तमान में मुक्त) परावर्तक उत्पाद का उपयोग नहीं कर रहे हैं, तो आपको चाहिए। – jcolebrand

उत्तर

18

इस MSDN पेज http://msdn.microsoft.com/en-us/library/akth6b1k.aspx में "टिप्पणी" खंड पर एक नज़र डालें:

आप एक वस्तु कई बार पुन: उपयोग करने, FileInfo बजाय इसी स्थिर तरीकों में से उदाहरण विधि का उपयोग करने पर विचार जा रहे हैं फ़ाइल कक्षा, क्योंकि एक सुरक्षा जांच हमेशा आवश्यक नहीं होगी।

मैं फ़ाइल (निर्देशिका) और FileInfo (DirectoryInfo) कक्षाओं के बीच यह अंतर सबसे महत्वपूर्ण है।

युपीडी: समान प्रश्न https://stackoverflow.com/a/1324808/380123

12

वाया Redgate परावर्तक:

File.Move()

public static void Move(string sourceFileName, string destFileName) 
{ 
    if ((sourceFileName == null) || (destFileName == null)) 
    { 
     throw new ArgumentNullException((sourceFileName == null) ? "sourceFileName" : "destFileName", Environment.GetResourceString("ArgumentNull_FileName")); 
    } 
    if ((sourceFileName.Length == 0) || (destFileName.Length == 0)) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyFileName"), (sourceFileName.Length == 0) ? "sourceFileName" : "destFileName"); 
    } 
    string fullPathInternal = Path.GetFullPathInternal(sourceFileName); 
    new FileIOPermission(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand(); 
    string dst = Path.GetFullPathInternal(destFileName); 
    new FileIOPermission(FileIOPermissionAccess.Write, new string[] { dst }, false, false).Demand(); 
    if (!InternalExists(fullPathInternal)) 
    { 
     __Error.WinIOError(2, fullPathInternal); 
    } 
    if (!Win32Native.MoveFile(fullPathInternal, dst)) 
    { 
     __Error.WinIOError(); 
    } 
} 

और FileInfo.MoveTo()

public void MoveTo(string destFileName) 
{ 
    if (destFileName == null) 
    { 
     throw new ArgumentNullException("destFileName"); 
    } 
    if (destFileName.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyFileName"), "destFileName"); 
    } 
    new FileIOPermission(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, new string[] { base.FullPath }, false, false).Demand(); 
    string fullPathInternal = Path.GetFullPathInternal(destFileName); 
    new FileIOPermission(FileIOPermissionAccess.Write, new string[] { fullPathInternal }, false, false).Demand(); 
    if (!Win32Native.MoveFile(base.FullPath, fullPathInternal)) 
    { 
     __Error.WinIOError(); 
    } 
    base.FullPath = fullPathInternal; 
    base.OriginalPath = destFileName; 
    this._name = Path.GetFileName(fullPathInternal); 
    base._dataInitialised = -1; 
} 
3

मुख्य अंतर केवल मैं देख सकता हूँ File.Move है स्थिर और FileInfo.MoveTo नहीं है।
इसके अलावा वे लगभग एक ही कोड चलाते हैं।

+0

हाँ मैं सहमत हूं; और FileInfo फ़ाइलसिस्टम इन्फॉर्म बनाम फ़ाइल को विरासत में प्राप्त करता है। FileSystemInfo स्पष्ट रूप से केवल मार्शलिंग को देता है, इसलिए मुझे लगता है कि FileInfo अधिक प्रबंधित मित्रवत है। – jcolebrand

5

एक महत्वपूर्ण अंतर में एक ही व्याख्या यह है कि FileInfo.MoveTo() गंतव्य पथ के लिए FileInfo वस्तु की filepath अपडेट कर देगा। यह स्पष्ट रूप से File.Move() का मामला नहीं है क्योंकि यह केवल स्ट्रिंग को इनपुट के रूप में उपयोग करता है।