我尝试将文件从一个网络共享复制到另一个网络共享。
当我运行代码时,它显示“复制失败”。但是它能够在目标文件夹中创建文件夹结构。
这意味着此文件夹在运行后存在于目标共享上:\DiskStation\OpenKM Import Handled\20200728-132700\Strato\2013
但是没有创建任何文件。您可以在第一个异常中看到源文件夹和目标文件夹。
我做错了什么?以防它很重要。该应用程序在windows上运行。不同的共享位于Synology Diskstation上。
如有任何帮助,我们将不胜感激。
谢谢
为此,我使用了jcifs.smb包。
相关的行是:
SmbFile targetFolder = getMoveToTargetFile(targetToMoveTo, newDocName, def);
SmbFile targetFile = new SmbFile(targetFolder, String.format("%s%s", targetToMoveTo, newDocName));
entry.copyTo(targetFile);可执行的代码如下:
jcifs.smb.SmbException: Failed to copy file from [smb://;OpenKM:xxxx@Diskstation/OpenKM Hot Folder/Strato/2013/DRP48646659.pdf] to [smb://;OpenKM:xxxx@Diskstation/OpenKM Import Handled/20200728-132700/Strato/2013/DRP4864665(2).pdf]
at jcifs.smb.SmbCopyUtil.copyFile(SmbCopyUtil.java:186)
at jcifs.smb.SmbFile.copyRecursive(SmbFile.java:1390)
at jcifs.smb.SmbFile.copyTo(SmbFile.java:1441)
at com.engst.test.java_project.App.handleFileEntry(App.java:272)
at com.engst.test.java_project.App.handleDirectoryEntry(App.java:181)
at com.engst.test.java_project.App.handleDirectoryEntry(App.java:194)
at com.engst.test.java_project.App.handleDirectoryEntry(App.java:194)
at com.engst.test.java_project.App.main(App.java:100)
Caused by: jcifs.smb.SmbException: The filename, directory name, or volume label syntax is incorrect.
at jcifs.smb.SmbTransportImpl.checkStatus2(SmbTransportImpl.java:1461)
at jcifs.smb.SmbTransportImpl.checkStatus(SmbTransportImpl.java:1572)
at jcifs.smb.SmbTransportImpl.sendrecv(SmbTransportImpl.java:1027)
at jcifs.smb.SmbTransportImpl.send(SmbTransportImpl.java:1543)
at jcifs.smb.SmbSessionImpl.send(SmbSessionImpl.java:409)
at jcifs.smb.SmbTreeImpl.send(SmbTreeImpl.java:472)
at jcifs.smb.SmbTreeConnection.send0(SmbTreeConnection.java:404)
at jcifs.smb.SmbTreeConnection.send(SmbTreeConnection.java:318)
at jcifs.smb.SmbTreeConnection.send(SmbTreeConnection.java:298)
at jcifs.smb.SmbTreeHandleImpl.send(SmbTreeHandleImpl.java:130)
at jcifs.smb.SmbTreeHandleImpl.send(SmbTreeHandleImpl.java:117)
at jcifs.smb.SmbFile.openUnshared(SmbFile.java:693)
at jcifs.smb.SmbFile.openUnshared(SmbFile.java:655)
at jcifs.smb.SmbCopyUtil.openCopyTargetFile(SmbCopyUtil.java:68)
at jcifs.smb.SmbCopyUtil.copyFile(SmbCopyUtil.java:124)
... 7 more发布于 2020-07-28 20:05:57
参考这个。The filename, directory name or volume label syntax incorrect
目录或文件名可能包含无效字符,如空格。你可以尝试使用英文字符only.And,如果这样做有效的话,可以尝试挑战其他东西。谢谢你。
发布于 2020-07-29 15:40:48
我现在找到了一个适合我的解决方案。我现在正在为网络共享获取SmbResourece,并基于这些获取SmbFile对象来执行复制操作。
我还可以在connectString变量中省略用户名和密码。
使用这种方法,我可以复制文件。
请随时告诉我,我如何才能使其更流畅或更好地实践,就像这样。
谢谢。
SmbFile srcFile = null;
try {
Properties prop = new Properties();
prop.put( "jcifs.smb.client.enableSMB2", "true");
prop.put( "jcifs.smb.client.disableSMB1", "false");
prop.put( "jcifs.traceResources", "true" );
Configuration config = new PropertyConfiguration(prop);
BaseContext bc = new BaseContext(config);
NtlmPasswordAuthenticator auth = new NtlmPasswordAuthenticator("", "OpenKM", "xxxx");
CIFSContext ct = bc.withCredentials(auth);
String connectString = "smb://192.168.10.10/OpenKM Hot Folder/";
connectString = connectString.replace('\\', '/');
SmbResource sr = ct.get(connectString);
srcFile = new SmbFile(sr, "Strato/2013/DRP46412852.pdf");
BaseContext bc2 = new BaseContext(config);
NtlmPasswordAuthenticator auth2 = new NtlmPasswordAuthenticator("", "OpenKM", "xxxx");
CIFSContext ct2 = bc2.withCredentials(auth2);
String connectString2 = "smb://192.168.10.10/OpenKM Import Handled/";
connectString2 = connectString2.replace('\\', '/');
SmbResource sr2 = ct2.get(connectString2);
SmbFile targetFile = new SmbFile(sr2, "20200728-223352/Strato/2013/paul(2).pdf");
srcFile.copyTo(targetFile);
} finally {
srcFile.close();
}https://stackoverflow.com/questions/63133456
复制相似问题