FileInfo.MoveTo()vs File.Move()

时间:2010-04-28 21:32:44

标签: c# .net file-io

这两种移动文件的方法有什么区别吗?

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");

4 个答案:

答案 0 :(得分:25)

请查看此MSDN页面http://msdn.microsoft.com/en-us/library/akth6b1k.aspx中的“备注”部分:

  

如果要多次重用对象,请考虑使用 FileInfo 的实例方法,而不是文件类的相应静态方法,因为安全检查并不总是必要的。

我认为这种差异在文件(目录)和FileInfo(DirectoryInfo)类之间最为重要。

UPD:类似问题https://stackoverflow.com/a/1324808/380123

中的相同解释

答案 1 :(得分:13)

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

和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;
}

答案 2 :(得分:11)

一个重要的区别是FileInfo.MoveTo()会将FileInfo对象的文件路径更新为目标路径。这显然不是File.Move()的情况,因为它只使用字符串作为输入。

答案 3 :(得分:2)

我能看到的唯一显着差异是File.Move是静态的,FileInfo.MoveTo不是。
除此之外,它们运行的​​代码大致相同。