【问题标题】:How can I mount a windows drive in Java?如何在 Java 中挂载 Windows 驱动器?
【发布时间】:2008-10-16 14:43:07
【问题描述】:

我们正在处理一些通过字母(例如 f:\)访问共享驱动器的旧代码。使用 UNC 表示法不是一种选择。我们的 Java 包装器应用程序将作为服务运行,作为第一步,我想在代码中显式映射驱动器。有人做过吗?

【问题讨论】:

  • 如果这是针对“用户”的,请考虑在字母表末尾选择一个不会因插入一两个 USB 设备而变得不可用的字母。
  • 这是个好建议。 USB 设备首先可用。在我们的例子中,选择的字母是我们无法控制的。我们只需要映射它。

标签: java windows-services unc


【解决方案1】:

考虑执行映射网络驱动器的 DOS 命令,如下代码所示:

String command = "c:\\windows\\system32\\net.exe use f: \\\\machine\\share /user:user password";
Process p = Runtime.getRuntime().exec(command);
...

查看 net use 命令的详细信息:

该命令的语法是: 网络使用 [设备名称 | *] [\\计算机名\共享名[\volume] [密码| *]] [/USER:[域名\]用户名] [/USER:[虚线域名\]用户名] [/USER:[用户名@dotted域名] [/智能卡] [/已保存] [[/删除] | [/坚持:{是|不}]] 网络使用 {设备名称 | *} [密码 | *] /家 网络使用 [/持久性:{是 |不}]

【讨论】:

  • 如果用户已经映射了 f: 会发生什么?如果我们多次运行同一个程序并在中间终止它(例如在调试会话期间)会发生什么?
  • 如果用户已经映射了驱动器 f: 你会得到“系统错误 85 已经发生”。在过程输出中。您只需扫描即可。
  • 挂载后,我们可以使用普通的FS命令对目录进行操作吧?您可以添加一个示例来读取文件吗?当我执行Path share = Paths.get(new URI("f:\")); 时,我收到一个错误 Provider "f" not installed.
【解决方案2】:

你可以使用 JCIFS

http://jcifs.samba.org/src/docs/api/jcifs/smb/SmbFile.html

或者如果您想要更高级别的 API 并支持其他协议,例如 FTP、Zip 和其他:

http://commons.apache.org/vfs/filesystems.html

这两个选项都是纯 Java 和跨平台的。

【讨论】:

    【解决方案3】:

    我认为最简单的方法是使用 Runtime.getRuntime().exec() 方法并调用“net use”命令。

    例如:

        try {
            // Execute a command without arguments
            String command = "C:\\Windows\\system32\\net.exe use F: \\\\server\\share /user:user password";
            Process child = Runtime.getRuntime().exec(command);
        } catch (IOException e) {
        }
    

    【讨论】:

    • 直接使用 net.exe 不会处理错误情况,也不是平台中立的。
    • @munsingh:他要求 Windows。谁在乎跨平台
    猜你喜欢
    • 2016-08-10
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2014-03-30
    相关资源
    最近更新 更多