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

我在我的C#应用​​程序中使用SSH.NET将文件从Windows复制到UNIX服务器,我有几个场景:

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

  2. 在UNIX Server目录中, 如果要复制的文件已存在 ,则在复制在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; } } 

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

你自己联系的问题是:

上传文件后,创建和修改日期将更改为上载发生的时间。


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

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

 cat source > target 

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


如果您希望远程文件时间戳与源本地文件的时间戳匹配,则必须对其进行编码(就像您已经知道的问题中所做的那样):
SSH.NET:是否可以使用SFTP上传文件并保留源文件中的文件日期?

请注意, “SSH.NET错误地执行”并不正确。 它做它应该(可能)的事情。 它无处可以保证为您保留时间戳。