Изменено изменение даты и времени при перемещении файла с Windows на сервер UNIX с использованием SSH.NET - PullRequest
0 голосов
/ 30 октября 2018

Я использую SSH.NET в своем приложении C # для копирования файлов с Windows на сервер UNIX, у меня есть несколько сценариев для этого:

  1. В каталоге сервера UNIX , если файл для копирования не существует , тогда измененная дата и время файла, когда он копируется в UNIX сервер переходит на скопированную дату и время ? Это правильно, потому что измененное время и дата не должны меняться правильно?

  2. В каталоге сервера UNIX , если файл для копирования уже существует , то при копировании того же файла, который заменяется в пути к серверу UNIX , дата и время изменения файла не меняются !

Я запутался в этой измененной дате и времени, поскольку я прочитал в этом сообщении , что SSH.NET делает это неправильно, это должно быть правильно?

Для тех из вас, кто просит предоставить код, здесь идет речь:

private static int UploadFileToSFTP (string localFileFullPath, string uploadPath)
{
    try
    {
        Log.Debug("Inside Utilities.UploadFileToSFTP() with localFileFullPath=" + localFileFullPath + ", and remoteUploadPath=" + uploadPath);
        Log.Debug("Uploading File : " + uploadPath);

        using (FileStream fs = new FileStream(localFileFullPath, FileMode.Open))
        {
            Log.Debug("Checking if path: " + Path.GetDirectoryName(uploadPath).Replace("\\", "/") + " already exists");
            if (!IsDirectoryExists(Path.GetDirectoryName(uploadPath).Replace("\\", "/")))
            {
                Log.Debug(Path.GetDirectoryName(uploadPath).Replace("\\", "/") + " | Directory does not exist, creating!");
                sftpClient.CreateDirectory(Path.GetDirectoryName(uploadPath).Replace("\\", "/"));
            }
            else
            {
                Log.Debug(Path.GetDirectoryName(uploadPath).Replace("\\", "/") + " | Directory already exists!");
            }
            Log.Debug("Checking if file: " + uploadPath + " already exists");
            if (sftpClient.Exists(uploadPath))
            {
                Log.Debug(uploadPath + " | File Already exists in the  Server");
            }
            else
            {
                Log.Debug(uploadPath + " | File Does not exist in the  Server!");
            }
            sftpClient.BufferSize = 1024;
            sftpClient.UploadFile(fs, uploadPath);
            fs.Close();
        }

        return 1;
    }
    catch (Exception exception)
    {
        Log.Error("Error in Utilities.UploadFileToSFTP(): ", exception);
        return 0;
    }
}

1 Ответ

0 голосов
/ 31 октября 2018

Временная метка файла на удаленном SFTP-сервере всегда будет установлена ​​на время, в которое удаленный файл был изменен в последний раз (т. Е. Время загрузки) - как и в случае любого другого файла на сервере Linux.

Как вопрос , который вы связали сами говорит:

после загрузки файлов даты создания и изменения изменяются на время, когда была произведена загрузка.


Полагаю, вы как-то ожидаете, что используется локальная временная метка файла. Это не. Вы не загружаете локальный файл. Вы загружаете данные из потока (Stream интерфейс). SSH.NET (пусть только SFTP-сервер) даже не знает, что ваш экземпляр Stream произошел из локального файла. Поэтому SSH.NET (пусть только SFTP-сервер) не может знать временную метку локального файла.

В конце концов, он ведет себя так, будто вы скопировали файл на сервере Linux через канал (аналогично потоку) вместо использования команды cp, например:

cat source > target

Содержимое копируется, но отметка времени всегда будет временем последней модификации (т.е. временем копирования).


Если вы хотите, чтобы временная метка удаленного файла совпадала с временной меткой исходного локального файла, вы должны закодировать это (как сделано в вопросе, который вы уже знаете):
SSH.NET: можно ли загружать файлы с использованием SFTP и сохранять даты файлов из исходных файлов?

Обратите внимание, что это неправда, что "SSH.NET делает это неправильно" . Он делает то, что должен (мог). Он нигде не обещает вам сохранить временную метку для вас.

...