2010-04-28 14 views
19

Czy jest jakaś różnica między tymi dwoma metodami przenoszenia pliku?FileInfo.MoveTo() kontra 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

Na czym polega pytanie? Wydają się być dwiema różnymi metodami osiągnięcia tego samego interfejsu API. Szukasz zapętlonej wydajności lub najlepszych praktyk lub ??? – jcolebrand

+0

Byłem po prostu ciekawy, dlaczego istnieją dwie metody, które wydają się robić dokładnie to samo. –

+0

Cóż, mam nadzieję, że poniższe fragmenty pokazują, jak się różnią? Ponadto, jeśli nie używasz (obecnie darmowego) produktu Reflector od Red Gate, powinieneś. – jcolebrand

Odpowiedz

18

Spójrz na sekcji „Uwagi” w niniejszym MSDN stronie http://msdn.microsoft.com/en-us/library/akth6b1k.aspx:

Jeśli masz zamiar użyć ponownie obiektowi kilkakrotnie, należy rozważyć użycie metody instancji FileInfo zamiast odpowiedniej metody statyczne klasy Plik, ponieważ kontrola bezpieczeństwa nie zawsze będzie konieczna.

I ta różnica jest najbardziej znacząca między klasami File (Directory) i FileInfo (DirectoryInfo).

UPD: To samo wyjaśnienie w podobnym pytaniem https://stackoverflow.com/a/1324808/380123

12

Via RedGate Reflektor:

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(); 
    } 
} 

i 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

Jedyna istotna różnica widzę to jest File.Move static i FileInfo.MoveTo nie jest.
Poza tym działają mniej więcej w tym samym kodzie.

+0

Tak, zgadzam się; a FileInfo dziedziczy FileSystemInfo versus File właśnie dziedziczy Object. FileSystemInfo najwyraźniej daje tylko Marshalling, więc domyślam się, że FileInfo jest bardziej zarządzane. – jcolebrand

5

Ważną różnicą jest to, że FileInfo.MoveTo() aktualizuje filepath obiektu FileInfo do ścieżki docelowej. Oczywiście nie ma to miejsca w File.Move(), ponieważ używa tylko łańcuchów jako danych wejściowych.