FileInfo.MoveTo () против File.Move () - PullRequest
24 голосов
/ 29 апреля 2010

Есть ли разница между этими двумя способами перемещения файла?

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 ]

25 голосов
/ 06 декабря 2011

Взгляните на раздел «Замечания» на этой странице MSDN http://msdn.microsoft.com/en-us/library/akth6b1k.aspx:

Если вы собираетесь повторно использовать объект несколько раз, рассмотрите возможность использования метода экземпляра FileInfo вместо соответствующих статических методов класса File , поскольку проверка безопасности не будет всегда будет необходимо.

Я думаю, что это различие наиболее существенно между классами File (Directory) и FileInfo (DirectoryInfo).

UPD: то же самое объяснение в аналогичном вопросе https://stackoverflow.com/a/1324808/380123

13 голосов
/ 29 апреля 2010

через отражатель 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;
}
12 голосов
/ 27 февраля 2015

Важным отличием является то, что FileInfo.MoveTo () обновит путь к файлу объекта FileInfo до пути назначения. Это, очевидно, не относится к File.Move (), поскольку он использует только строки в качестве входных данных.

2 голосов
/ 29 апреля 2010

Единственное существенное отличие, которое я вижу, состоит в том, что File.Move является статическим, а FileInfo.MoveTo - нет.
Кроме того, они запускают примерно один и тот же код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...