Подтвердить что ты не робот

FileInfo.MoveTo() vs 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");
4b9b3361

Ответ 1

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

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

Это различие является наиболее значимым для классов File (Directory) и FileInfo (DirectoryInfo).

UPD: то же объяснение в аналогичном вопросе fooobar.com/questions/15628/...

Ответ 2

Через рефлектор 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

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

Ответ 4

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