FileInfo.MoveTo() vs File.Move()
Is there any difference between these two methods of moving a file?
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");
Take a look at "Remarks" section in this MSDN page http://msdn.microsoft.com/en-us/library/akth6b1k.aspx :
If you are going to reuse an object several times, consider using the instance method of
FileInfo
instead of the corresponding static methods of theFile
class, because a security check will not always be necessary.
I think this difference is most significant between File
(Directory
) and FileInfo
(DirectoryInfo
) classes.
Update: The same explanation in similar question: https://stackoverflow.com/a/1324808/380123
Via RedGate Reflector:
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();
}
}
and 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;
}
An important difference is that FileInfo.MoveTo()
will update the filepath of the FileInfo
object to the destination path. This is obviously not the case of File.Move()
since it only uses strings as input.
The only significant difference I can see is File.Move
is static and FileInfo.MoveTo
is not.
Apart from that they run approximately the same code.
精彩评论