使用JCIFS检查文件是否存在很容易:
import jcifs.smb.*;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain", "username", "password");
SmbFile file = new SmbFile("smb://server/filepath", auth);
if( file.exists() ) { ... }
现在假设您想将所有这些放在一个循环中并检查是否存在各种文件。我假设在这种情况下new SmbFile("smb://server/filepath", auth);
将为每个文件设置一个新连接。我是对的吗?
所以我的问题是:在SMB上测试文件存在的资源最少的方法是什么?
我在考虑让file
指向SMB根目录,然后使用file.listFiles(java.lang.String wildcard)
检查文件是否存在。但问题是listFiles
递归不起作用。我可以把它包起来并使它递归,但那不会很干净。
答案 0 :(得分:1)
回应:
new SmbFile("smb://server/filepath", auth);
将为每个文件设置新连接
直到您实际尝试对服务器执行某些操作(例如,检查存在)时才建立连接。但是,它使用相同的连接与服务器通信以进行操作。 SmbTransport
类是解决这个问题的方法。您可以使用wireshark或任何其他监视工具来查看操作使用与服务器相同的连接。
因此,为了回应'检查是否存在 a 文件'的资源最少的方法,您可以检查它是否存在。
如果您正在检查多个文件,并且您已经知道他们的名字,那么只检查存在仍然是最有效的方式。
如果您不知道文件的名称,并且使用listFiles
(和子目录下降),那么您将要求服务器提供更多数据,例如:项目的每个条目属性(如果它们是目录或不是目录),目录包含数百个,可能是数千个条目,这些条目可能相当于在行走树时缓存的批次数据。