使用SSH.NET将文件从Windows移动到UNIX服务器时,修改的日期时间会更改

时间:2018-10-30 11:50:54

标签: c# linux unix sftp ssh.net

我在C#应用程序中使用SSH.NET将文件从Windows复制到UNIX服务器,对此有几种方案:

  1. 在UNIX服务器目录中如果要复制的文件不存在 ,则将文件复制到的修改日期时间UNIX服务器更改为复制的日期时间?是正确的,因为修改后的日期时间不应该更改吗?

  2. 在UNIX服务器目录中,如果要复制的文件已经存在 ,则在复制相同文件后,该文件将在UNIX服务器路径中被替换文件的修改日期时间不变

我对修改后的日期时间感到困惑,正如我在post中读到的那样,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 :(得分:1)

远程SFTP服务器上文件的时间戳将始终设置为上次修改远程文件的时间(即上载时间)-与Linux服务器上的任何其他文件一样。

正如question you have linked yourself所说:

  

上传文件后,创建日期和修改日期会更改为上传日期。


我假设您以某种方式期望涉及本地文件时间戳。不是。您没有上传本地文件。您正在从流(Stream界面)上传数据。 SSH.NET(仅允许SFTP服务器使用)甚至不知道您的Stream实例源自本地文件。因此SSH.NET(仅允许SFTP服务器)无法知道本地文件的时间戳。

最后,它的行为就像您通过管道(类似于流)而不是使用cp命令在Linux服务器上复制文件一样,

cat source > target

内容将被复制,但是时间戳将始终是最后一次修改的时间(即复制时间)。


如果您希望远程文件的时间戳与源本地文件的时间戳相匹配,则必须对此进行编码(就像在您已经知道的问题中所做的那样):
SSH.NET: Is it possible to upload files using SFTP and preserve the file dates from source files?

请注意,“ SSH.NET错误地做到了这一点” 并不是真的。它做了它应该(可以)做的事情。它无处保证您为自己保留时间戳。