重用 JCIFS SMB 连接来检查各种文件是否存在

Reusing JCIFS SMB connection to check existence of various files

使用 JCIFS 检查文件是否存在很容易:

  1. 您设置凭据:
import jcifs.smb.*;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain", "username", "password");
  1. 您与文件建立连接:
SmbFile file = new SmbFile("smb://server/filepath", auth);
  1. 您检查它是否存在:
if( file.exists() ) { ... }

现在假设您想将所有这些放在一个循环中并检查是否存在各种文件。我假设在这种情况下 new SmbFile("smb://server/filepath", auth); 将为每个文件建立一个新连接。我说得对吗?

所以我的问题是:通过 SMB 测试文件是否存在的资源占用最少的方法是什么?

我在想让file指向SMB根目录,然后用file.listFiles(java.lang.String wildcard)检查文件是否存在。但问题是 listFiles 不能递归工作。我可以将它包装起来并使其递归,但这并不干净。

回应:

new SmbFile("smb://server/filepath", auth); will set up a new connection for each file

在您实际尝试对服务器执行某些操作(例如检查是否存在)之前,连接不会建立。但是,它使用相同的连接与服务器通信以进行操作。 SmbTransport class 就是处理这个问题的东西。您可以使用 wireshark 或任何其他监控工具来查看操作是否使用与服务器的相同连接。

因此,为了响应“检查 a 文件 是否存在的资源占用最少的方法是什么”,您检查它存在。

如果您正在检查多个文件,并且您已经知道它们的名称,那么只检查是否存在仍然是最有效的方法。

如果您不知道文件的名称,并且使用 listFiles(和子目录下降),那么您将需要从服务器请求更多的数据,例如项目的每个条目属性,如果它们是目录或不是目录,目录有数百个,也许数千个条目,这可能相当于 lot 在遍历树时要缓存的数据。