使用 Java 安装了 samba 驱动器,但文件资源管理器中的驱动器标签未更新?

rho*_*ell 5 java windows samba

我正在开发一个 Java GUI 应用程序,它可以卸载 Samba 共享并将其安装到特定的盘符驱动器。当用户选择时,驱动器已成功卸载和安装,但驱动器标签(驱动器的显示名称)未在 Windows 文件资源管理器中更新。

我正在使用ProcessBuilder来执行命令,当我自己使用 Windows CMD 时,我不会遇到此问题,但我运行的命令是相同的。

processBuilder = new ProcessBuilder( "net",
        "use",
        "T:",
        "\\\\" + SERVER_NAME + "\\" + SHARE_NAME + "\\" + FOLDER,
        "/USER:" + USERNAME,
        PASSWORD,
        "/PERSISTENT:NO"
        );
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是,当我第一次打开应用程序 GUI 中内置的文件浏览器时它显示带有正确标签的驱动器,即使 Windows 文件资源管理器显示旧标签。这只是当您第一次打开它时的情况,然后它不会显示任何新的驱动器标签。

我猜这更多是我正在处理的 Windows 特定问题,而不是代码问题。有什么想法可以强制窗口刷新标签或任何其他想法吗?

更新 - 我发现,如果我explorer.exe在任务管理器中重新启动进程,当我重新打开文件资源管理器时,它将刷新标签。我不想在我的应用程序中执行此操作,因为它会刷新整个 Windows 桌面界面,但它可能会提供一些见解。

更新 2 - 我还注意到,如果我Thread.sleep()在卸载初始驱动器和安装所选驱动器之间持续 5 秒,标签就会正确更新...这可以完成工作,但令人烦恼的是,这是我迄今为止找到的最佳解决方案。我目前正在计算需要让线程休眠的最短时间...1 秒还不够长。

Azt*_*des 0

我有两种可行的方法。

  1. 模拟F5按键事件:只需在Java中模拟F5按键事件即可。它应该针对文件资源管理器窗口。

示例代码:

import java.awt.Robot;
import java.awt.event.KeyEvent;

public class RefreshExplorer {
    public static void main(String[] args) {
        try {
            Robot robot = new Robot();
            robot.keyPress(KeyEvent.VK_F5);
            robot.keyRelease(KeyEvent.VK_F5);
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用循环优化 sleep 方法:通过在 Java 中使用循环,假设每 500 毫秒检查一次工作是否完成,您不需要等待 5 秒,并且可以通过尝试更短的时间来找出最快的时间。

在代码中,该方法isDriveLabelUpdated()将是您需要编码的方法,用于检查驱动器标签是否已更新并返回布尔值。

示例代码:

for (int i = 0; i < 10; i++) { 
    Thread.sleep(500);  // Sleep for 500 milliseconds
    if (isDriveLabelUpdated()) { 
        break;  // Exit the loop if the update is detected
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要第二个想法的帮助或有任何疑问,请随时提出。