重用JCIFS SMB连接以检查各种文件的存在

时间:2015-10-14 07:25:29

标签: java smb jcifs

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

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

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

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

        我在考虑让file指向SMB根目录,然后使用file.listFiles(java.lang.String wildcard)检查文件是否存在。但问题是listFiles递归不起作用。我可以把它包起来并使它递归,但那不会很干净。

1 个答案:

答案 0 :(得分:1)

回应:

  

new SmbFile("smb://server/filepath", auth);将为每个文件设置新连接

直到您实际尝试对服务器执行某些操作(例如,检查存在)时才建立连接。但是,它使用相同的连接与服务器通信以进行操作。 SmbTransport类是解决这个问题的方法。您可以使用wireshark或任何其他监视工具来查看操作使用与服务器相同的连接。

因此,为了回应'检查是否存在 a 文件'的资源最少的方法,您可以检查它是否存在。

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

如果您不知道文件的名称,并且使用listFiles(和子目录下降),那么您将要求服务器提供更多数据,例如:项目的每个条目属性(如果它们是目录或不是目录),目录包含数百个,可能是数千个条目,这些条目可能相当于在行走树时缓存的批次数据。