存在时替换文件在 Spring Integration Smb 中不起作用

Replace file when exists not working in Spring Integration Smb

我正在尝试将文件写入 smb 文件夹,第一次写入时它工作正常但是当再次写入同一个文件时它会抛出错误

原因:org.springframework.core.NestedIOException:无法将 [/remote-target-dir/smbTest.test.writing] 重命名为 [/remote-target-dir/smbTest.test]。嵌套异常是 jcifs.smb.SmbException:当文件已经存在时无法创建文件。

我正在使用 FileTransferringMessageHandler 作为默认文件存在模式的 FileTransferringMessageHandler 但它仍然无法替换。

我调试到 SmbSession class,当流程到达 rename(String _pathFrom, String _pathTo) 方法中的这段代码时

  if (this.smbShare.isReplaceFile() && smbFileTo.exists()) {
            smbFileTo.delete();
  }

我看到 smbShareisReplaceFile() 是错误的,这就是为什么我认为它无法删除以前的同名文件

完整代码如下:

连接:

 @Bean
public SmbSessionFactory smbSessionFactory() {
    SmbSessionFactory smbSession = new SmbSessionFactory();
    smbSession.setHost("localhost");
    smbSession.setPort(445);
    smbSession.setDomain("DESKTOP-07O79IT");
    smbSession.setUsername("Dell");
    smbSession.setPassword("changeIt");
    smbSession.setShareAndDir("Users\DELL\Desktop\Shared");
    smbSession.setSmbMinVersion(DialectVersion.SMB210);
    smbSession.setSmbMaxVersion(DialectVersion.SMB311);
    return smbSession;
}

出站发送文件到 smb:

@ServiceActivator(inputChannel = "storeToSmb")
@Bean
public MessageHandler smbMessageHandler(SmbSessionFactory smbSessionFactory) {
    FileTransferringMessageHandler<SmbFile> handler =
            new FileTransferringMessageHandler<>(smbSessionFactory);
    handler.setRemoteDirectoryExpression(
            new LiteralExpression("/remote-target-dir"));
    handler.setFileNameGenerator(m -> "smbTest.test");
    handler.setAutoCreateDirectory(true);
    return handler;
}

网关:

@Override
public void run(ApplicationArguments args) throws Exception {
    File file  = new File("smbFile.txt");
    try(FileWriter writer = new FileWriter(file)){
        writer.write("This is sample smb write");
        messageGateway.storeToSmb(file);
    }catch (IOException e){
        System.out.println("Error: "+e);
    }
}

你能帮忙解决这个问题吗?

SmbSessionFactory 必须与 setReplaceFile(true) 一起提供。 FileTransferringMessageHandler 对其依赖关系不做任何事情,也不能改变它,尽管它有自己的逻辑 FileExistsMode.REPLACE