我有一个由我们公司的多个人运营的日食RCP产品。所有PC都运行某些版本的Windows。我们可以访问不同人已映射到不同驱动器号的共享PC。这意味着可以以许多不同的方式引用相同的文件,这取决于运行程序的PC。 E.g。
我想以编程方式检查通用PC上是否有任意文件。有没有一种强大的方法在java中执行此操作?
我们目前的解决方案有点黑客由于人们映射到不同的驱动器号,更改驱动器号,不便携等等,它不健壮。
private static boolean isOnCommunalPc(File file) {
if(file.getAbsolutePath().toLowerCase().startsWith("\\\\communalPC")) {
return true;
}
if(file.getAbsolutePath().toLowerCase().startsWith("y:")){
return true;
}
if(file.getAbsolutePath().toLowerCase().startsWith("z:")){
return true;
}
return false;
}
答案 0 :(得分:3)
Java无法区分文件所在的机器,因为Windows将该层从JVM中抽象出来。但是,您可以明确表达您的联系。
您是否有理由在公共电脑上没有ftp或http服务器(甚至是自定义Java服务器!),并通过主机名或IP访问它?这样,用户映射网络驱动器的位置并不重要,您通过静态地址连接。
使用Java访问远程文件非常简单:
URL remoteUrl = new URL(String.format("%s/%s", hostName, fileName));
InputStream remoteInputStream remoteUrl.openConnection().getInputStream();
//copyStreamToFile(remoteInputStream, new File(destinationPath), false);
如果您希望文件对于您不希望更改的库或代码是本地文件,则可以:
void copyStreamToFile(InputStream in, File outputFile, boolean doDeleteOnExit) {
//Clean up file after VM exit, if needed.
if(doDeleteOnExit)
outputFile.deleteOnExit();
FileOutputStream outputStream = new FileOutputStream(outputFile);
ReadableByteChannel inputChannel = Channels.newChannel(in);
WritableByteChannel outputChannel = Channels.newChannel(outputStream);
ChannelTools.fastChannelCopy(inputChannel, outputChannel);
inputChannel.close();
outputChannel.close()
}
编辑使用JCIFS通过Samba访问远程文件非常简单:
domain = ""; //Your domain, only set if needed.
NtlmPasswordAuthentication npa = new NtlmPasswordAuthentication(domain, userName, password);
SmbFile remoteFile = new SmbFile(String.format("smb://%s/%s", hostName, fileName), npa);
//copyStreamToFile(new SmbFileInputStream(remoteFile), new File(destinationPath), false)
这可能是最实用的解决方案,因为它需要Windows服务器上的最少工作量。这将插入Windows中的现有服务器框架,而不是安装更多。