Java 重用JCIFS SMB连接以检查各种文件的存在
使用JCIFS检查文件是否存在很容易:Java 重用JCIFS SMB连接以检查各种文件的存在,java,smb,jcifs,Java,Smb,Jcifs,使用JCIFS检查文件是否存在很容易: 您可以设置凭据: 您可以连接到该文件: 你检查它的存在: 现在假设您想将所有这些放在一个循环中,并检查是否存在各种文件。我假设在这种情况下,newsmbfile(“smb://server/filepath“,auth)将为每个文件建立新连接。我说得对吗 所以我的问题是:在SMB上测试文件存在性的资源密集度最低的方法是什么? 我在考虑让file指向SMB根目录,然后使用来检查文件是否存在。但问题是,listFiles不能递归工作。我可以将其包装并使其递归,
newsmbfile(“smb://server/filepath“,auth)代码>将为每个文件建立新连接。我说得对吗
所以我的问题是:在SMB上测试文件存在性的资源密集度最低的方法是什么?
我在考虑让file
指向SMB根目录,然后使用来检查文件是否存在。但问题是,listFiles
不能递归工作。我可以将其包装并使其递归,但这并不干净。响应:
新建SMB文件(“smb://server/filepath“,auth)代码>将为每个文件建立新连接
在您实际尝试对服务器执行某些操作(例如,检查是否存在)之前,不会建立连接。但是,它使用相同的连接与服务器进行操作对话。课堂是处理这个问题的东西。您可以使用wireshark或任何其他监视工具查看操作是否使用与服务器相同的连接
因此,在回答“检查文件是否存在的资源密集度最低的方法是什么”时,您需要检查它是否存在
如果您正在检查多个文件,并且您已经知道它们的名称,那么检查是否存在仍然是最有效的方法
如果您不知道文件名,并且使用listFiles
(和子目录下降),那么您将从服务器请求更多的数据,例如,项目的每个条目属性(如果项目是否为目录)、包含数百个或数千个条目的目录,这相当于在遍历树时要缓存大量数据。我知道文件名。所以基本上你说的是我应该做SmbFile file=newsmbfile(“smb://server/a-file-path“,auth);如果(file.exists()){…}
用于我要检查的每个文件,并且底层代码将发挥神奇的作用,并为每个exists()
check重用连接?是的,这是正确的-它为每个exists()
check重用相同的连接。
import jcifs.smb.*;
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain", "username", "password");
SmbFile file = new SmbFile("smb://server/filepath", auth);
if( file.exists() ) { ... }