JSch,会话打开时锁定文件
JSch, lock file while session is open
有什么方法可以锁定我正在使用 JSch sftp 通道读取的文件,以防止其他应用程序在会话打开时修改它?
我遇到的问题:当我 reading/writing 文件时,其他一些应用程序更改了文件并导致错误。
目前我是这样读取文件的:
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
InputStream stream = sftp.get("/some/file");
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
// read from br
} finally {
stream.close();
}
而不是锁定文件(这可能会对您建议的正在更改文件的任何应用程序产生不利影响),并且假设您具有 ssh 访问权限和权限,您可以使用 ssh 命令将文件复制到临时文件中(如果在 'nix 系统上:'cp /some/file/ /some/temp/file/'),这很可能比通过 scp 传输快得多。 (有关执行示例,请参见 http://www.jcraft.com/jsch/examples/Exec.java.html)。从那里,scp-get 临时文件。最后,如有必要,通过其他 JSch exec 命令删除临时文件。
Jsch此时supports version 3 of the SFTP protocol. The wikipedia page contains links to different versions of the protocol. Version 3 is here,而且其中任何地方都没有出现“锁”字。换句话说,该协议不支持锁定,因此Jsch 不支持任何内容。
SFTP 版本 5 and 6 包含对锁定远程文件的支持。但是,Jsch 不支持这些协议版本。
我要补充一点 OpenSSH,最广泛使用的 SSH/SFTP 服务器,仅支持 SFTP 版本 3。您必须使用其他一些服务器软件才能处理文件锁。
有什么方法可以锁定我正在使用 JSch sftp 通道读取的文件,以防止其他应用程序在会话打开时修改它?
我遇到的问题:当我 reading/writing 文件时,其他一些应用程序更改了文件并导致错误。
目前我是这样读取文件的:
ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");
InputStream stream = sftp.get("/some/file");
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
// read from br
} finally {
stream.close();
}
而不是锁定文件(这可能会对您建议的正在更改文件的任何应用程序产生不利影响),并且假设您具有 ssh 访问权限和权限,您可以使用 ssh 命令将文件复制到临时文件中(如果在 'nix 系统上:'cp /some/file/ /some/temp/file/'),这很可能比通过 scp 传输快得多。 (有关执行示例,请参见 http://www.jcraft.com/jsch/examples/Exec.java.html)。从那里,scp-get 临时文件。最后,如有必要,通过其他 JSch exec 命令删除临时文件。
Jsch此时supports version 3 of the SFTP protocol. The wikipedia page contains links to different versions of the protocol. Version 3 is here,而且其中任何地方都没有出现“锁”字。换句话说,该协议不支持锁定,因此Jsch 不支持任何内容。
SFTP 版本 5 and 6 包含对锁定远程文件的支持。但是,Jsch 不支持这些协议版本。
我要补充一点 OpenSSH,最广泛使用的 SSH/SFTP 服务器,仅支持 SFTP 版本 3。您必须使用其他一些服务器软件才能处理文件锁。