我需要制作一个可以在单个实例中执行的程序。我尝试创建一个临时文件并在退出程序之前将其删除。
public static boolean isLocked() {
File f = new File("lock.txt");
return f.exists();
}
public static void lock() {
String fname = "lock.txt";
File f = new File(fname);
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void unlock() {
File f = new File("lock.txt");
f.delete();
}
在框架中
private void initialize() {
lock();
}
private void setFrameHandler() {
frame.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
unlock();
}
});
}
如果程序在紧急情况下完成(例如断电),则会出现问题。文件不会删除,并且无法运行新实例。 如何进行可靠的单实例验证?
答案 0 :(得分:1)
您可以使用GetProcesses方法在启动时检查程序的另一个实例,如here所述 但这只取决于你拥有的场景(可能看不到其他用户的所有进程)
如果通过File.Open
锁定特定文件,您可以做的另一件事就是检查File.Open ("path.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite);
只要在程序中保持生成的FileStream,其他程序就无法以该模式打开文件。这基本上是Unix锁文件的工作原理。当然,你必须捕获IOException(暗示你是一个锁定的文件)。
免责声明:我没有尝试该代码,请检查我是否给了您正确的参数。
修改:您还可以查看此代码项目article,了解如何使用win32 API
使用Windows消息传递的另一种尝试已经完成here
答案 1 :(得分:0)
在一台机器上实现这一目的的一个简单方法是编写一个'PID文件',它实际上是一个包含当前正在运行的进程的操作系统ID的文件。您在开始“关键”工作时创建此项,并在成功完成后将其删除。
由于不可能使用相同的PID再次启动进程,因此您只需检查PID文件是否已存在,如果存在,则该进程是否仍在运行。