我正在开发一个 Java GUI 应用程序,它可以卸载 Samba 共享并将其安装到特定的盘符驱动器。当用户选择时,驱动器已成功卸载和安装,但驱动器标签(驱动器的显示名称)未在 Windows 文件资源管理器中更新。
我使用
ProcessBuilder
来执行命令,当我自己使用 Windows CMD 时,我不会遇到此问题,但我运行的命令是相同的。
processBuilder = new ProcessBuilder( "net",
"use",
"T:",
"\\\\" + SERVER_NAME + "\\" + SHARE_NAME + "\\" + FOLDER,
"/USER:" + USERNAME,
PASSWORD,
"/PERSISTENT:NO"
);
真正奇怪的是,当我“第一次”打开应用程序 GUI 中内置的文件浏览器时,它显示带有正确标签的驱动器,即使 Windows 文件资源管理器显示旧标签。这只是您第一次打开它时的情况,然后它不会显示任何新的驱动器标签。 我猜这更多是我正在处理的 Windows 特定问题,而不是代码问题。有什么想法可以强制窗口刷新标签或任何其他想法吗?
更新 - 我发现,如果我在任务管理器中重新启动
explorer.exe
进程,当我重新打开文件资源管理器时,它将刷新标签。我不想在我的应用程序中执行此操作,因为它会刷新整个 Windows 桌面界面,但它可能会提供一些见解。
更新 2 - 我还注意到,如果我在卸载初始驱动器和安装所选驱动器之间Thread.sleep()
5 秒,标签就会正确更新...这可以完成工作,但令人烦恼的是,这是我找到的最佳解决方案迄今为止。我目前正在计算需要让线程休眠的最短时间...1 秒不够长。
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();
}
}
}
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
}
}
如果您需要第二个想法的帮助或有任何疑问,请随时提问。