【问题标题】:In java is there a way to tell on which physical computer a file resides?在java中有没有办法判断文件驻留在哪台物理计算机上?
【发布时间】:2015-07-08 10:35:18
【问题描述】:

我有一个由我们公司的多人运行的 Eclipse RCP 产品。所有 PC 都运行某些版本的 Windows。我们可以访问共享的 PC,不同的人已将其映射到不同的驱动器号。这意味着同一文件可能会以多种不同的方式被引用,具体取决于运行程序的 PC。例如

  • \communalPC\Shared\foo.txt
  • Y:\Shared\foo.txt
  • Z:\Shared\foo.txt

我想以编程方式检查公用 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;
}

【问题讨论】:

  • 从您的代码示例看来,该文件始终位于公用 PC 上?
  • 谢谢,这是一个错字。我将最后一个 return 语句从 true 更改为 false。
  • 获取绝对路径是一个好的开始。在 Windows 上,可以结合运行外部脚本来确定驱动器的映射路径。在 cmd.exe 中,“net use”命令在网络级别打印所有网络驱动器路径的映射。如果您从绝对路径获取的驱动器不在“网络使用”列表中,那么它必须在本地主机上,并且应该与在 Windows 中从外部脚本运行“echo %cd%”所给出的相同。
  • 对于我们的情况来说,使用“net use”是一个好主意,因为我们只在 Windows 上运行,它绕过了硬编码驱动器号。我认为这解决了我最紧迫的问题。谢谢!

标签: java file-io


【解决方案1】:

Java 无法区分文件在哪台机器上,因为 Windows 将该层从 JVM 中抽象出来。但是,您可以明确说明您的联系。

您在公用 pc 上不能有 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()
}

编辑通过 Samba 使用 JCIFS 访问远程文件非常简单:

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 中现有的服务器框架,而不是安装更多。

【讨论】:

  • 感谢您的回答。我同意一个更好的长期解决方案是通过某种服务器调解对公共电脑的访问。不幸的是,这可能需要一些组织变革,这可能比编码更难!同时,我将答案设为“否”,因为文件所在的物理 PC 已从 JVM 中抽象出来,所以无法做到。
  • @ranga,如果您还没有设置其他类型的服务器,请查看我的编辑,显示基本 Samba 用法。
  • 我们的问题更多是用户指定的文件(来自 gui 或脚本),然后可能会被更改/删除。我正在寻找一种方法来防止意外选择公共文件。想想看,我们正在寻找一种方法来阻止进程在远程文件上运行,而不是连接到远程文件!文件的权限应该可以防止这种情况,但最好有多层防御。不过,您展示的基本 Samba 用法可能在不同的上下文中很有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2022-11-26
  • 2013-10-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
相关资源
最近更新 更多