.Net для перемещения/копирования файла при сохранении временных меток

Кто-нибудь знает библиотеку .Net, где файл может быть скопирован/вставлен или перемещен без изменения каких-либо временных меток. Функциональность, которую я ищу, содержится в программе robocopy.exe, но мне бы хотелось, чтобы эта функциональность не использовалась для совместного использования этого двоичного файла.

Мысли?

Ответ 1

public static void CopyFileExactly(string copyFromPath, string copyToPath)
{
    var origin = new FileInfo(copyFromPath);

    origin.CopyTo(copyToPath, true);

    var destination = new FileInfo(copyToPath);
    destination.CreationTime = origin.CreationTime;
    destination.LastWriteTime = origin.LastWriteTime;
    destination.LastAccessTime = origin.LastAccessTime;
}

Ответ 2

При выполнении без административных привилегий ответ Роя будет вызывать исключение (UnauthorizedAccessException) при попытке перезаписать существующие файлы только для чтения или при попытке установить отметки времени для скопированных файлов только для чтения.

Следующее решение основано на ответе Роя, но расширяет его, чтобы перезаписать файлы только для чтения и изменить временные метки на скопированных файлах только для чтения, сохраняя при этом атрибут только для чтения файла, все еще исполняемый без прав администратора.

public static void CopyFileExactly(string copyFromPath, string copyToPath)
{
    if (File.Exists(copyToPath))
    {
        var target = new FileInfo(copyToPath);
        if (target.IsReadOnly)
            target.IsReadOnly = false;
    }

    var origin = new FileInfo(copyFromPath);
    origin.CopyTo(copyToPath, true);

    var destination = new FileInfo(copyToPath);
    if (destination.IsReadOnly)
    {
        destination.IsReadOnly = false;
        destination.CreationTime = origin.CreationTime;
        destination.LastWriteTime = origin.LastWriteTime;
        destination.LastAccessTime = origin.LastAccessTime;
        destination.IsReadOnly = true;
    }
    else
    {
        destination.CreationTime = origin.CreationTime;
        destination.LastWriteTime = origin.LastWriteTime;
        destination.LastAccessTime = origin.LastAccessTime;
    }
}

Ответ 4

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