You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用smbj在SMB共享重命名带内容文件后内容丢失问题求助

smbj重命名文件内容丢失问题解决方案

问题根源

你代码中smbShare.open方法传入的SMB2CreateDisposition参数配置确实存在错误:

  • 你默认给smb2CreateDisposition赋值为SMB2CreateDisposition.FILE_OVERWRITE_IF,该参数的语义为:打开目标路径时如果文件已存在,直接覆盖清空所有内容,不存在则新建空文件。
  • 你仅在判断源路径为文件夹时修改了该参数为FILE_OPEN_IF,文件类型的分支下没有修改这个默认值,等于你打开源文件准备执行重命名操作的第一步,就已经把源文件的内容全部清空,最终重命名得到的自然是空文件。

修复方案

将默认的smb2CreateDisposition赋值改为SMB2CreateDisposition.FILE_OPEN即可,该参数的语义为仅打开已存在的文件,不会修改原有文件的任何内容,修改后的代码参考如下:

public void rename(String pathFrom, String pathTo) {
    pathFrom = formatPath(pathFrom);
    pathTo = formatPath(pathTo);
    Set<SMB2ShareAccess> shareAccessSet = new HashSet<>();
    shareAccessSet.add(SMB2ShareAccess.FILE_SHARE_READ);
    shareAccessSet.add(SMB2ShareAccess.FILE_SHARE_WRITE);
    shareAccessSet.add(SMB2ShareAccess.FILE_SHARE_DELETE);

    Set<FileAttributes> fileAttributes = new HashSet<>();
    fileAttributes.add(FileAttributes.FILE_ATTRIBUTE_NORMAL);
    Set<SMB2CreateOptions> createOptions = new HashSet<>();
    // 仅修改这一行默认值即可
    SMB2CreateDisposition smb2CreateDisposition = SMB2CreateDisposition.FILE_OPEN;

    if (isFolder(pathFrom)) {
        createOptions.add(SMB2CreateOptions.FILE_DIRECTORY_FILE);
        smb2CreateDisposition = SMB2CreateDisposition.FILE_OPEN_IF;
    }
    else if (isFile(pathFrom)) {
        createOptions.add(SMB2CreateOptions.FILE_NON_DIRECTORY_FILE);
    }
    else {
        throw new IllegalArgumentException("Path '" + pathFrom + "' can't be resolved to file nor directory");
    }
    try (DiskEntry file = this.smbShare.open(pathFrom, of(AccessMask.MAXIMUM_ALLOWED), fileAttributes, shareAccessSet,
            smb2CreateDisposition, createOptions)) {
        file.rename(pathTo, true);
    }
}

内容的提问来源于stack exchange,提问作者flomo83

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:36:04