如何使用JSch进行原子SFTP文件传输,以便在写入过程完成之前无法访问该文件?

万事达

我编写了一个小的Java程序,该程序使用Jsch将多个文本文件传输到远程服务器。由于单个文件可能很大,因此传输最多需要20秒。

在远程服务器上,生成的文件将在我无法控制的各个时间点进行访问(读取)。我已经测试过在服务器上进行SFTP传输期间复制文件。复制的文件没有完整的数据,因此它需要完成,因为在复制命令时尚不完全可用。

如何确保仅在传输完全完成后才能访问文件,以便可以完全读取文件?由于我无法控制远程服务器上的文件访问,因此需要一种从Java程序执行此操作的方法。

这是我编写的代码的相关部分:

InputStream contentInputStream = null;
try {
    contentInputStream = new ByteArrayInputStream(Files.readAllBytes(Paths.get("test1.txt")));
} catch (IOException e) {
    e.printStackTrace();
}
sftpChannel.put(contentInputStream, "abc.txt");
肯斯特

您正在将文件写入远程服务器上的目录,并且远程服务器上的某些进程正在监视文件是否出现在该目录中。在文件完全写入服务器之前,您不希望远程进程对文件执行操作。

设置此系统的任何人都应该在考虑此问题的情况下进行设计。在服务器之间传输文件需要花费时间,并且传输也可能在完成之前失败。需要一种设计好的方式将文件传输到服务器,然后使其可用于此远程进程。

有三种常见的方法可以做到这一点:

将文件写入另一个文件夹:将文件写入远程服务器上的“临时”或“工作”目录,该文件不受远程进程的监视。文件传输完成后,将文件从临时目录移动到实际目标目录。将文件从一个目录移动到另一个目录应该是一个瞬时操作。SFTP允许将文件从一个目录移动到远程服务器上的另一个目录。

将文件写入特殊文件名:将文件写入远程系统上的目标目录,但使用远程进程将忽略的特殊文件名。文件传输完成后,将文件重命名为正确的名称。例如,如果远程进程正在寻找以“ .xml”结尾的文件名,则可以在远程服务器上创建一个名为“ foo.xml.tmp”的文件,将数据写入其中,然后从“ foo.xml.tmp”到“ foo.xml”。SFTP允许在远程服务器上重命名文件。

使用修改时间戳记:远程进程可以检查将要处理的文件的最后修改时间戳记,而忽略在最后一分钟左右已被修改的文件。此行为必须内置到远程进程中。SFTP可以在远程文件上设置修改时间戳记,而JSCH支持它,但是通常不会显式调用此函数。通常,您将依赖于远程文件的上次修改时间戳来反映您写入文件的过程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Jsch 进行异步 sftp 文件传输?

来自分类Dev

BitmapImage无法访问该文件

来自分类Dev

如何解决错误“由于另一个进程正在使用该文件,因此该进程无法访问该文件”

来自分类Dev

该进程无法访问该文件,因为该文件正被另一个使用streamwriter的进程使用

来自分类Dev

删除文件夹但进程无法访问该文件,因为正在使用

来自分类Dev

该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

ImportError:DLL加载失败:系统无法访问该文件

来自分类Dev

StreamReader C# 错误:进程无法访问该文件,因为它正在被使用

来自分类Dev

sftp JSch传输文件到远程cygwin

来自分类Dev

该进程无法访问该文件,因为该文件正在被另一个进程使用(已创建文件但不包含任何文件)

来自分类Dev

该进程无法访问该文件,因为该文件正在被另一个进程使用。文件复制

来自分类Dev

TFS进程无法访问文件,因为该文件正在被另一个进程使用

来自分类Dev

无法访问在Java和Windows中打开的文件,即使Java不再使用该文件也是如此

来自分类Dev

无法复制。该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

该进程无法访问该文件,因为在使用 start 打开最大化窗口时,另一个进程错误正在使用该文件

来自分类Dev

如何加密我的文件夹,以便无法访问其内容?

来自分类Dev

Apache服务器中的Tesseract:该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

系统IO异常:该进程无法访问该文件,因为该文件正在被另一个进程c#使用

来自分类Dev

Directory.GetFiles失败,出现错误该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

java.nio.file.FileSystemException:该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

该进程无法访问该文件,因为该文件正在被另一个进程使用。代号:80070020,VBScript

来自分类Dev

msbuild可以在构建期间解锁锁定的dll吗,从而避免单击“由于另一个进程使用该文件而无法访问该文件”?

来自分类Dev

在我的点网程序中收到“该进程无法访问该文件,因为该文件正在被另一个进程使用”的错误

来自分类Dev

Windows 10上的python 2.7.6线程:该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

面对多线程堆栈跟踪-该进程无法访问该文件,因为该文件正在被另一个进程使用

来自分类Dev

该进程无法访问该文件,因为该文件正在被另一个进程使用。File.Create方法

来自分类Dev

系统IO异常:该进程无法访问该文件,因为该文件正在被另一个进程c#使用

来自分类Dev

实现Kernel32Dll.CreateFile给出“该进程无法访问该文件,因为该文件正在被另一个进程使用”错误

Related 相关文章

  1. 1

    使用 Jsch 进行异步 sftp 文件传输?

  2. 2

    BitmapImage无法访问该文件

  3. 3

    如何解决错误“由于另一个进程正在使用该文件,因此该进程无法访问该文件”

  4. 4

    该进程无法访问该文件,因为该文件正被另一个使用streamwriter的进程使用

  5. 5

    删除文件夹但进程无法访问该文件,因为正在使用

  6. 6

    该进程无法访问该文件,因为该文件正在被另一个进程使用

  7. 7

    该进程无法访问该文件,因为该文件正在被另一个进程使用

  8. 8

    ImportError:DLL加载失败:系统无法访问该文件

  9. 9

    StreamReader C# 错误:进程无法访问该文件,因为它正在被使用

  10. 10

    sftp JSch传输文件到远程cygwin

  11. 11

    该进程无法访问该文件,因为该文件正在被另一个进程使用(已创建文件但不包含任何文件)

  12. 12

    该进程无法访问该文件,因为该文件正在被另一个进程使用。文件复制

  13. 13

    TFS进程无法访问文件,因为该文件正在被另一个进程使用

  14. 14

    无法访问在Java和Windows中打开的文件,即使Java不再使用该文件也是如此

  15. 15

    无法复制。该进程无法访问该文件,因为该文件正在被另一个进程使用

  16. 16

    该进程无法访问该文件,因为在使用 start 打开最大化窗口时,另一个进程错误正在使用该文件

  17. 17

    如何加密我的文件夹,以便无法访问其内容?

  18. 18

    Apache服务器中的Tesseract:该进程无法访问该文件,因为该文件正在被另一个进程使用

  19. 19

    系统IO异常:该进程无法访问该文件,因为该文件正在被另一个进程c#使用

  20. 20

    Directory.GetFiles失败,出现错误该进程无法访问该文件,因为该文件正在被另一个进程使用

  21. 21

    java.nio.file.FileSystemException:该进程无法访问该文件,因为该文件正在被另一个进程使用

  22. 22

    该进程无法访问该文件,因为该文件正在被另一个进程使用。代号:80070020,VBScript

  23. 23

    msbuild可以在构建期间解锁锁定的dll吗,从而避免单击“由于另一个进程使用该文件而无法访问该文件”?

  24. 24

    在我的点网程序中收到“该进程无法访问该文件,因为该文件正在被另一个进程使用”的错误

  25. 25

    Windows 10上的python 2.7.6线程:该进程无法访问该文件,因为该文件正在被另一个进程使用

  26. 26

    面对多线程堆栈跟踪-该进程无法访问该文件,因为该文件正在被另一个进程使用

  27. 27

    该进程无法访问该文件,因为该文件正在被另一个进程使用。File.Create方法

  28. 28

    系统IO异常:该进程无法访问该文件,因为该文件正在被另一个进程c#使用

  29. 29

    实现Kernel32Dll.CreateFile给出“该进程无法访问该文件,因为该文件正在被另一个进程使用”错误

热门标签

归档