【问题标题】:SFTP method to check if the given file is openSFTP方法检查给定文件是否打开
【发布时间】:2015-11-23 09:58:38
【问题描述】:

我正在将一段代码从 FTP 转换为 SFTP。在 FTP 中,此代码用于通过尝试重命名文件来检查给定文件是否打开。在 FTP 库 (org.apache.commons.net) 中,这是一种尝试重命名文件并在给定文件是否更改时返回的方法。但在 SFTP(我使用的是 JSch 库)中,rename 方法返回 null。我的 moto 是检查给定文件是否打开?有什么想法吗?

下面是FTP中的代码:

boolean renameSuccess = userSharedDrive.rename(prefixedOriginalFileName, prefixedTempRenamedFile);

【问题讨论】:

  • 这个方法不好——一些服务器可以为以后的操作重命名文件,但保持句柄有效。这是特定于服务器的。

标签: ftp sftp jsch apache-commons-net


【解决方案1】:

JSch ChannelSftp.rename 不返回任何内容,它具有 void “return” 类型(也许这就是您所说的 null)。

如果重命名失败,它会抛出异常。所以如果不抛出,则重命名成功。


您可以尝试的另一种方法是以追加模式打开文件进行写入,而不是向其中写入任何内容。如果文件由另一个进程/客户端打开,则打开应该失败(抛出异常)。

sftp.put(filepath, ChannelSftp.APPEND).close()

这样,您根本不会修改(重命名)文件。

【讨论】:

  • 该方法看起来不错,但它不会破坏错误处理的主要目的。当错误发生时,我们正在做一项关键的工作。错误处理应该处理不需要的执行路径。
  • 对不起,我不明白你的意思。
  • 此方法似乎也特定于服务器和/或客户端。根据我使用 Total Commander 作为上传器和 sshj 作为下载器客户端的经验,OpenMode.APPEND 总是可以的,而 OpenMode.WRITE 总是失败(即使没有并发上传)。也许涉及一些权限。无论如何决定采用 Steven 描述的方法(在某个时间间隔检查大小)。
【解决方案2】:

你为什么要做检查?如果您正在检查文件以确保您没有选择正在更改的文件,那么我建议您统计文件以获取其修改时间 (SftpATTRS.getMTim​​e) 和(SftpATTRS.getSize) 大小。然后稍等片刻,再次统计,确保修改时间和大小没有变化。

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多