使用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
相关产品推荐
相关产品推荐

