【问题标题】:SSH.NET: Is it possible to upload files using SFTP and preserve the file dates from source files?SSH.NET:是否可以使用 SFTP 上传文件并保留源文件中的文件日期?
【发布时间】:2016-08-06 22:41:12
【问题描述】:

目前,我正在使用 Renci SSH.NET 库通过 SFTP 将文件上传到 Unix 服务器。我不喜欢的一件事是,在上传文件后,创建日期和修改日期会更改为上传发生的时间。

我想保留源文件中的原始文件日期,可以吗?

【问题讨论】:

    标签: c# file-upload ssh sftp ssh.net


    【解决方案1】:

    SSH.NET 库不会自动为您执行此操作。您必须对其进行编码。

    SftpClient.SetLastWriteTimeSftpClient.SetLastWriteTimeUtc 方法。但它们实际上还没有实现。

    你可以这样编码:

    SftpFileAttributes fileAttributes = client.GetAttributes(targetFile);
    fileAttributes.LastWriteTime = File.GetLastWriteTime(sourceFile);
    client.SetAttributes(targetFile, fileAttributes);
    

    虽然由于SftpFileAttributes 中缺少 UTC API,但如果客户端和服务器不在同一个时区,您可能无法正确设置时间戳。


    更多详情,请查看我的回复:
    Modified date time changes when moving a file from Windows to UNIX server using SSH.NET


    或者使用另一个能够自动保存时间戳的 SFTP 库,最好是支持 UTC。

    例如,WinSCP .NET assembly 会自动执行此操作。只需使用Session.PutFiles method

    session.PutFiles(sourceFile, targetFile).Check();
    

    (我是 WinSCP 的作者)

    【讨论】:

    • 是的,您的回答很有帮助,但是我不小心评论了错误的线程,我的道歉。我注意到这段代码比较慢,我必须保存我上传的几千个小文件的文件日期,每个只有几 KB 大小,并且与只需要几秒钟的复制过程相比,改变了属性每个文件都需要很长时间,我系统上的 2000 个文件需要几分钟。有什么方法可以让这个速度更快?
    • 1) 什么代码? SSH.NET 还是 WinSCP? 2)无论如何,我们不知道是什么让它变慢了。在要求我们进行优化之前,您必须找出答案。一般来说,我只能建议你并行处理。 SFTP 协议允许这样做。排队多个请求以设置时间戳。在 SSH.NET 中,看看SftpSession.RequestLStat 是如何实现的。删除WaitOnHandle 并适当替换它以进行并行处理。
    猜你喜欢
    • 2015-09-17
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2012-04-06
    相关资源
    最近更新 更多