.Net библиотека для перемещения / копирования файла с сохранением временных меток - PullRequest
11 голосов
/ 23 августа 2011

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

Мысли

Ответы [ 4 ]

18 голосов
/ 23 августа 2011
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;
}
11 голосов
/ 20 июня 2013

При выполнении без прав администратора ответ Роя вызовет исключение (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 голосов
/ 23 августа 2011

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

2 голосов
/ 23 августа 2011

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

...