检查给定文件是否打开的SFTP方法

检查给定文件是否打开的SFTP方法,ftp,sftp,jsch,apache-commons-net,Ftp,Sftp,Jsch,Apache Commons Net,我正在将一段代码从FTP转换为SFTP。在FTP中,此代码用于通过尝试重命名文件来检查给定文件是否打开。在FTP库(org.apache.commons.net)中,这是一种尝试重命名文件并返回给定文件是否更改的方法。但是在SFTP(我使用的是JSch库)中,rename方法返回null。我的任务是检查给定的文件是否打开?有什么想法吗 以下是FTP中的代码: boolean-renameSuccess=userSharedDrive.rename(prefixedOriginalFileName

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

以下是FTP中的代码:

boolean-renameSuccess=userSharedDrive.rename(prefixedOriginalFileName,prefixedtempnamedfile);

JSch
ChannelSftp.rename
不返回任何内容,它具有
void
返回类型(可能这就是您所说的null)

如果重命名失败,它将引发异常。因此,如果不抛出,则重命名成功


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

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

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

为什么要进行检查?如果您正在对文件进行检查,以确保没有拾取正在更改的文件,那么我建议您统计该文件以获取其修改时间(SftpATTRS.getMTime)和(SftpATTRS.getSize)大小。然后等待一小段时间,再次统计,以确保修改时间和大小没有更改。

该方法不好——一些服务器可以重命名文件以备将来操作,但保持句柄有效。这是特定于服务器的。该方法看起来不错,但它不破坏错误处理的主要目的。当发生错误时,我们正在做一项重要的工作。错误处理应该处理不需要的执行路径。对不起,我不明白你的意思。此方法似乎也是服务器和/或客户端特定的。根据我的经验,Total Commander作为上传程序,sshj作为下载程序客户端OpenMode.APPEND始终正常,而OpenMode.WRITE总是失败(即使没有并发上传)。可能涉及一些权限。无论如何,我们决定采用Steven描述的方法(每隔一段时间检查大小)。