JAVA UYGULAMASI- PROGRAMIN AYNI ANDA İKİ DEFA CALİSMASINI ENGELLEME

Posted by & filed under .

Cok sinir bir olay.

Bütün günümü yedi diyebilirim.Biraz da acemi oluşumuz da etkendi tabi.Ama sonunda File Lock ve File Channel Kütüphanelerini kullanarak çözdüm.

Eger siz de programınız aynı anda iki defa acilmasın istiyorsanız,bu nacizade kod blogunu kullanabilirsiniz. Taze cikti.

Algoritmam basit.6 adım.

1-)Lock File  bulunuyor mu kontrol et.

2-)Eger calisan bir Lock Dosyası varsa kontrol et ve Lock File dosyasını silmeyi dene

3-)Lock File dosyasını al.

4-)Lock File dosyasını alamazsan ,hata mesajı gönder.De ki zaten bu programa ait bir ornek calisiyor.

5-)Eger Lock File dosyasını başarıyla  alırsan main içinde ne yaptırcaksan o blogun içine yaz.

6-)Uygulama bitirildiginde kapandıgında lock file dosyasını ortadan kaldır.

Gelelim nacizade ornegimize.

 

package filelockchannel;

/**
*
* @author Mete
*/

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import javax.swing.JOptionPane;

public class FileLockChannel {

private static File LockDosyam;
private static FileChannel channel;
private static FileLock lock;

public static void main(String[] args) {
try {
LockDosyam = new File("KaleKilit.lock");
// Kontrol ettik bulunuyor mu diye
if (LockDosyam.exists()) {
// bulunuyorsa ne duruyorsun sil gitsin.
LockDosyam.delete();
}
// Dosyayı almaya calistik. 3.Madde
channel = new RandomAccessFile(LockDosyam, "rw").getChannel();
lock = channel.tryLock();
if(lock == null)
{
// İkinci Maddedeki dosya kullanılıyor mu kontrolu.
channel.close();
throw new RuntimeException("Bu programda sadece bir instance calisir kardeş.");
}
// Bir kapama kolu
KapamaKolu kapamakolu = new KapamaKolu();
Runtime.getRuntime().addShutdownHook(kapamakolu);

//Buraya calismasını istediginiz kodlar
JOptionPane.showMessageDialog(null, "calisiyor");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
catch(IOException e)
{
throw new RuntimeException("İşlem başlatılamadı", e);
}

}

public static void DosyayiSilKaldir() {
// Dosyayı kaldır ve sil
try {
if(lock != null) {
lock.release();
channel.close();
LockDosyam.delete();
}
} catch(IOException e) {
e.printStackTrace();
}
}

static class KapamaKolu extends Thread {

public void run() {
DosyayiSilKaldir();
}
}

}