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

Java 重用JCIFS SMB连接以检查各种文件的存在,java,smb,jcifs,Java,Smb,Jcifs,使用JCIFS检查文件是否存在很容易: 您可以设置凭据: 您可以连接到该文件: 你检查它的存在: 现在假设您想将所有这些放在一个循环中,并检查是否存在各种文件。我假设在这种情况下,newsmbfile(“smb://server/filepath“,auth)将为每个文件建立新连接。我说得对吗 所以我的问题是:在SMB上测试文件存在性的资源密集度最低的方法是什么? 我在考虑让file指向SMB根目录,然后使用来检查文件是否存在。但问题是,listFiles不能递归工作。我可以将其包装并使其递归,

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

  • 您可以设置凭据:
  • 您可以连接到该文件:
  • 你检查它的存在:
  • 现在假设您想将所有这些放在一个循环中,并检查是否存在各种文件。我假设在这种情况下,
    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() ) { ... }