单个程序实例
Single program instance
我需要做一个程序,可以单机执行。我试图创建一个临时文件并在退出程序之前将其删除。
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();
}
});
}
如果程序在紧急情况下完成(例如停电),则会出现问题。文件不删除,并且 运行 一个新的实例是不可能的。
如何做靠谱的单例验证?
在单台机器上实现此目的的一个简单方法是编写一个 'PID file',它实际上是一个包含当前 运行 进程的操作系统 ID 的文件。您在开始 "critical" 工作时创建它,并在成功完成后将其删除。
由于该进程不太可能以相同的 PID 再次启动,您可以简单地检查 PID 文件是否已经存在,如果存在,该进程是否仍然 运行。
您可以使用 GetProcesses 方法在启动时检查程序的另一个实例 here
但这仅取决于您所拥有的场景(可能看不到其他用户的所有进程)
您可以做的另一件事是简单地检查特定文件是否通过 File.Open
锁定
File.Open ("path.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite);
只要您在程序中保持生成的 FileStream 打开,其他程序也无法以该模式打开文件。这基本上也是 Unix 锁文件的工作方式。当然,您必须捕获 IOException(提示您锁定文件)。
免责声明:我没有尝试该代码,所以请检查我是否给了你正确的参数。
编辑:您还可以查看此代码项目 article,了解如何使用 win32 API
已完成另一次使用 windows 消息传递的尝试 here
我需要做一个程序,可以单机执行。我试图创建一个临时文件并在退出程序之前将其删除。
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();
}
});
}
如果程序在紧急情况下完成(例如停电),则会出现问题。文件不删除,并且 运行 一个新的实例是不可能的。 如何做靠谱的单例验证?
在单台机器上实现此目的的一个简单方法是编写一个 'PID file',它实际上是一个包含当前 运行 进程的操作系统 ID 的文件。您在开始 "critical" 工作时创建它,并在成功完成后将其删除。
由于该进程不太可能以相同的 PID 再次启动,您可以简单地检查 PID 文件是否已经存在,如果存在,该进程是否仍然 运行。
您可以使用 GetProcesses 方法在启动时检查程序的另一个实例 here 但这仅取决于您所拥有的场景(可能看不到其他用户的所有进程)
您可以做的另一件事是简单地检查特定文件是否通过 File.Open
锁定File.Open ("path.lock", FileMode.OpenOrCreate, FileAccess.ReadWrite);
只要您在程序中保持生成的 FileStream 打开,其他程序也无法以该模式打开文件。这基本上也是 Unix 锁文件的工作方式。当然,您必须捕获 IOException(提示您锁定文件)。
免责声明:我没有尝试该代码,所以请检查我是否给了你正确的参数。
编辑:您还可以查看此代码项目 article,了解如何使用 win32 API
已完成另一次使用 windows 消息传递的尝试 here