Forum: D Programlama Dili RSS
Dizin bekçisi
Sayfa:  1  2  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Dizin bekçisi
[Resim: http://www.erdem.tk/wiki/_media/resim/soru2.png]

Özellikleri bu şekilde olabilir.  ;-)

Ben şimdilik şu kütüphaneye de bakıyorum:

http://code.dlang.org/packages/libasync
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu konu bir kaç gün önce İngilizce forumda da açıldı. Orada da söylendiği gibi, işletim sistemleri inotify gibi destek sağlıyorlar.

  http://forum.dlang.org/thread/anjvvpwaksrpgrxqqyzs@forum.d…

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ali hocam hatırlarsanız daha önce bu programın benzerini kütüğün değişme zamanını kaydederek yapmıştık.

İşletim sisteminden yardım alan sürümüne henüz bakamadım. Ama benim merak ettiğim acaba böyle bir uygulamada hash tablolarından faydalanılabilir mi.

Dikkat ederseniz git programı da benzer şekilde çalışıyor. Örneğin bir dosyada değişiklik yaptığınızda kırmızı ile gösteriyor eklediğinizde yeşil ile gösteriyor vs. Acaba o programı kodlarken nasıl yapmış olabilirler.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
lstat'ten yararlanıyormuş:

  https://stackoverflow.com/questions/1778862/how-does-git-d…

Orada söylendiğine göre, lstat şöyle kullanılıyormuş:

  https://www.kernel.org/pub/software/scm/git/docs/technical…

Ali
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
import std.stdio: writeln;
 
import libasync;
import libasync.watcher;
import libasync.threads;
 
shared static ~this() { destroyAsyncThreads(); }
 
void dizindeDeğişiklikOldu(DWChangeInfo değişiklik)
{
    writeln ("Dizinde değişiklik oldu : ", değişiklik);
    writeln ("Kutuk : ", değişiklik.path());
    switch (değişiklik.event)
    {
    case DWFileEvent.CREATED:
        writeln ("Kütük oluşturuldu");
        break;
    case DWFileEvent.DELETED:
        writeln ("Kütük silindi");
        break;
    case DWFileEvent.MODIFIED:
        writeln ("Kütük değişti");
        break;
    default:
        break;
    }
}
 
void main()
{
    auto olayDöngüsü = getThreadEventLoop();
 
    auto bekçi = new AsyncDirectoryWatcher(olayDöngüsü);
 
    DWChangeInfo[8] değişiklikBilgisi;
 
    bekçi.run(
    {
        writeln("Dizin olayı gerçekleşti");
        DWChangeInfo[] değişiklikler = değişiklikBilgisi;
 
        uint sayaç;
 
        do
        {
            sayaç = bekçi.readChanges(değişiklikler);
 
            foreach (i; 0 .. sayaç)
            {
                dizindeDeğişiklikOldu(değişiklikler[i]);
            }
        } while (sayaç > 0);
    });
 
    bekçi.watchDir("ilk");
 
    writeln("Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin");
 
    while (olayDöngüsü.loop())
        continue;
 
    writeln("Olay döngüsünden çıkıldı");
}
libasync ile ufak bir örnek yazdım. Yalnız emacs'ın dosya oluşturma davranışı biraz değişik  :-)

$ ./bekci
Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/yedi.d)
Kutuk : ilk/yedi.d
Kütük oluşturuldu
Kutuk : CREATED
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(DELETED, ilk/yedi.d)
Kutuk : ilk/yedi.d
Kütük silindi
Kutuk : DELETED
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(DELETED, ilk/dort.d)
Kutuk : ilk/dort.d
Kütük silindi
Kutuk : DELETED
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/.#beş.d)
Kutuk : ilk/.#beş.d
Kütük oluşturuldu
Kutuk : CREATED
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/beş.d)
Kutuk : ilk/beş.d
Kütük oluşturuldu
Kutuk : CREATED
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(DELETED, ilk/.#beş.d)
Kutuk : ilk/.#beş.d
Kütük silindi
Kutuk : DELETED
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kütüphanenin bize verdiğinden çok uygulamayı kurma, yönetme ve döngüye alma tarzı çok hoşuma gitti.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Peki diyelim ki 3 dakika kadar bekledikten sonra kaydetmek istiyoruz.

struct Dosya
{
    string isim;
    string[SysTime] olay;
}
 
Dosya[] dosyalar;
 
dosyalar ~= Dosya(değişiklik.path(), olay["kütük oluşturuldu"] = Clock.currTime());

Burada yapının kurucu işlevinde ilişkili diziyi nasıl ilklendiriyorduk  :-O
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdi biraz değişiklikten sonra kod şu hale geldi:

import std.stdio: writeln;
import std.datetime;
 
import libasync;
import libasync.watcher;
import libasync.threads;
 
shared static ~this() { destroyAsyncThreads(); }
 
struct Dosya
{
    string isim;
    string[SysTime] olay;
 
    this (DWChangeInfo değişiklik)
    {
        this.isim = değişiklik.path();
 
        string olay;
 
        switch (değişiklik.event)
        {
        case DWFileEvent.CREATED:
            olay = "oluşturuldu";
            break;
        case DWFileEvent.DELETED:
            olay = "silindi";
            break;
        case DWFileEvent.MODIFIED:
            olay = "değişti";
            break;
        default:
            break;
        }
        auto zaman = Clock.currTime();
 
        this.olay[zaman] = olay;
 
    }
}
 
Dosya[] dosyalar;
 
void dizindeDeğişiklikOldu(DWChangeInfo değişiklik)
{
    writeln ("Dizinde değişiklik oldu : ", değişiklik);
    writeln ("Kutuk : ", değişiklik.path());
    writeln ("Zaman : ", Clock.currTime());
 
    dosyalar ~= Dosya(değişiklik);
 
    foreach (dosya; dosyalar)
        writeln (dosya);
}
 
void main()
{
    auto olayDöngüsü = getThreadEventLoop();
 
    auto bekçi = new AsyncDirectoryWatcher(olayDöngüsü);
 
    DWChangeInfo[8] değişiklikBilgisi;
 
    bekçi.run(
    {
        writeln("Dizin olayı gerçekleşti");
        DWChangeInfo[] değişiklikler = değişiklikBilgisi;
 
        uint sayaç;
 
        do
        {
            sayaç = bekçi.readChanges(değişiklikler);
 
            foreach (i; 0 .. sayaç)
            {
                dizindeDeğişiklikOldu(değişiklikler[i]);
            }
        } while (sayaç > 0);
    });
 
    bekçi.watchDir("ilk");
 
    writeln("Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin");
 
    while (olayDöngüsü.loop())
        continue;
 
    writeln("Olay döngüsünden çıkıldı");
}
Örnek program çıktısı:
./bekci
Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/dene1.d)
Kutuk : ilk/dene1.d
Zaman : 2017-Aug-30 12:37:17.1026756
Dosya("ilk/dene1.d", [2017-Aug-30 12:37:17.1028144:"oluşturuldu"])
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/dene2.d)
Kutuk : ilk/dene2.d
Zaman : 2017-Aug-30 12:37:20.9996549
Dosya("ilk/dene1.d", [2017-Aug-30 12:37:17.1028144:"oluşturuldu"])
Dosya("ilk/dene2.d", [2017-Aug-30 12:37:20.9997566:"oluşturuldu"])
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/dene3.d)
Kutuk : ilk/dene3.d
Zaman : 2017-Aug-30 12:37:24.8695901
Dosya("ilk/dene1.d", [2017-Aug-30 12:37:17.1028144:"oluşturuldu"])
Dosya("ilk/dene2.d", [2017-Aug-30 12:37:20.9997566:"oluşturuldu"])
Dosya("ilk/dene3.d", [2017-Aug-30 12:37:24.8696896:"oluşturuldu"])
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/dene4.d)
Kutuk : ilk/dene4.d
Zaman : 2017-Aug-30 12:37:28.9620016
Dosya("ilk/dene1.d", [2017-Aug-30 12:37:17.1028144:"oluşturuldu"])
Dosya("ilk/dene2.d", [2017-Aug-30 12:37:20.9997566:"oluşturuldu"])
Dosya("ilk/dene3.d", [2017-Aug-30 12:37:24.8696896:"oluşturuldu"])
Dosya("ilk/dene4.d", [2017-Aug-30 12:37:28.962103:"oluşturuldu"])
Dizin olayı gerçekleşti
Dizinde değişiklik oldu : DWChangeInfo(CREATED, ilk/dene5.d)
Kutuk : ilk/dene5.d
Zaman : 2017-Aug-30 12:37:32.9691944
Dosya("ilk/dene1.d", [2017-Aug-30 12:37:17.1028144:"oluşturuldu"])
Dosya("ilk/dene2.d", [2017-Aug-30 12:37:20.9997566:"oluşturuldu"])
Dosya("ilk/dene3.d", [2017-Aug-30 12:37:24.8696896:"oluşturuldu"])
Dosya("ilk/dene4.d", [2017-Aug-30 12:37:28.962103:"oluşturuldu"])
Dosya("ilk/dene5.d", [2017-Aug-30 12:37:32.9692959:"oluşturuldu"])

Ama sanrım burada dosyaların dosya dizisine eklenip eklenmediğini de kontrol etmek gerekecek.
kerdemdemir #9
Üye Eyl 2013 tarihinden beri · 123 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Çok güzel bir paylaşım bence. Çok faydalı gözüküyor.
erdem (Moderatör) #10
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdi kendim bir zaman yapısı kullandım. Emacs'ın #otomatik kaydetme# ve yedekleme~ dosyalarını da kapatınca neredeyse olması gerektiği gibi çalışmaya başladı. Neredeyse diyorum çünkü son komut sanki yankı yapıyor. Aslında aynı saniye içerisinde sadece bir kere değişti diye kaydetmesini istiyoruz.
import std.stdio: writeln;
import std.algorithm: canFind;
import std.datetime: SysTime;
import std.datetime: Clock;
import std.format: format;
 
import libasync;
import libasync.watcher;
import libasync.threads;
 
shared static ~this() { destroyAsyncThreads(); }
 
struct Zaman
{
    SysTime zaman;
    ubyte saniye, dakika, saat;
    this (SysTime zaman)
    {
        this.zaman = zaman;
        this.saniye = zaman.second;
        this.dakika = zaman.minute;
        this.saat = zaman.hour;
    }
 
    string toString()
    {
        return format("%02s:%02s:%02s", this.saat, this.dakika, this.saniye);
    }
}
 
struct Dosya
{
    string isim;
    string[Zaman] olay;
 
    this (DWChangeInfo değişiklik)
    {
        this.isim = değişiklik.path();
 
        string olay;
 
        switch (değişiklik.event)
        {
        case DWFileEvent.CREATED:
            olay = "oluşturuldu";
            break;
        case DWFileEvent.DELETED:
            olay = "silindi";
            break;
        case DWFileEvent.MODIFIED:
            olay = "değişti";
            break;
        default:
            break;
        }
        auto zaman = Zaman(Clock.currTime());
        this.olay[zaman] = olay;
    }
 
    void olayEkle(DWChangeInfo değişiklik)
    {
        string olay;
 
        switch (değişiklik.event)
        {
        case DWFileEvent.CREATED:
            olay = "oluşturuldu";
            break;
        case DWFileEvent.DELETED:
            olay = "silindi";
            break;
        case DWFileEvent.MODIFIED:
            olay = "değişti";
            break;
        case DWFileEvent.MOVED_FROM:
            olay = "taşındı";
            break;
 
        default:
            break;
        }
        auto zaman = Zaman(Clock.currTime());
 
        this.olay[zaman] = olay;
    }
}
 
Dosya[] dosyalar;
 
void dizindeDeğişiklikOldu(DWChangeInfo değişiklik)
{
    if (!canFind(değişiklik.path(), "#")
        && !canFind(değişiklik.path(), "~"))
    {
        bool dosyaKayıtlı = false;
        int i = 0;
 
        for (; i < dosyalar.length; ++i)
        {
            if (canFind(dosyalar[i].isim, değişiklik.path()))
            {
                writeln(dosyalar[i].isim, " dosyası zaten kayıtlıymış");
                dosyaKayıtlı = true;
                break;
            }
 
        }
 
        if (dosyaKayıtlı)
        {
            writeln("Olay : ", değişiklik.event);
            dosyalar[i].olayEkle(değişiklik);
        }
 
        else
        {
            writeln("Olay : ", değişiklik.event);
            dosyalar ~= Dosya(değişiklik);
        }
 
    }
    
    foreach (dosya; dosyalar)
        writeln (dosya);
}
 
void main()
{
    auto olayDöngüsü = getThreadEventLoop();
 
    auto bekçi = new AsyncDirectoryWatcher(olayDöngüsü);
 
    DWChangeInfo[8] değişiklikBilgisi;
 
    bekçi.run(
    {
        DWChangeInfo[] değişiklikler = değişiklikBilgisi;
 
        uint sayaç;
 
        do
        {
            sayaç = bekçi.readChanges(değişiklikler);
 
            foreach (i; 0 .. sayaç)
            {
                dizindeDeğişiklikOldu(değişiklikler[i]);
            }
        } while (sayaç > 0);
    });
 
    bekçi.watchDir("ilk");
 
    writeln("Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin");
 
    while (olayDöngüsü.loop())
        continue;
 
    writeln("Olay döngüsünden çıkıldı");
}
Ama dikkat ederseniz yeşille gösterilen yerlerde aynı olayı iki defa kaydetmiş.
$ ./bekci
Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin
Olay : CREATED
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Olay : CREATED
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Dosya("ilk/2.d", [02:15:53:"oluşturuldu"])
Olay : CREATED
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Dosya("ilk/2.d", [02:15:53:"oluşturuldu"])
Dosya("ilk/3.d", [02:15:56:"oluşturuldu"])
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Dosya("ilk/2.d", [02:15:53:"oluşturuldu"])
Dosya("ilk/3.d", [02:15:56:"oluşturuldu"])
ilk/2.d dosyası zaten kayıtlıymış
Olay : MODIFIED
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Dosya("ilk/2.d", [02:15:53:"oluşturuldu", 02:16:18:"değişti"])
Dosya("ilk/3.d", [02:15:56:"oluşturuldu"])
ilk/2.d dosyası zaten kayıtlıymış
Olay : MODIFIED
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Dosya("ilk/2.d", [02:16:18:"değişti", 02:15:53:"oluşturuldu", 02:16:18:"değişti"])
Dosya("ilk/3.d", [02:15:56:"oluşturuldu"])
Dosya("ilk/1.d", [02:15:49:"oluşturuldu"])
Dosya("ilk/2.d", [02:16:18:"değişti", 02:15:53:"oluşturuldu", 02:16:18:"değişti"])
Dosya("ilk/3.d", [02:15:56:"oluşturuldu"])
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
Ama dikkat ederseniz yeşille gösterilen yerlerde aynı olayı iki defa kaydetmiş.

Olay ilişkili dizisindeki anahtarları tam tersine çevirince sanırım bu sorun da düzeldi  :-)
Avatar
Salih Dinçer #12
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Anladığım kadarıyla bunu vibe.d ve dub ile birlikte kullanıyoruz; derlemek için dub'ı nasıl kullanmalıyız?

Sanırım şöyle :)

1. DMD ve DUB'ın kurulu olduğu bir sistemin için çalıştığımızı düşünelim...

2. Kodu app.d isminde source dizini içine kaydediyoruz. Örneğin benim masaüstümde Erdem'in Projeleri isminde bir dizin var onun içinde watchdogdir diye bir dizin daha açtım.

3. Tabi dub komutunu vermeden evvel aynı dizinde şöyle bir dub.json olmalı:
{
    "name": "watchdogdir",
    "description": "A directory watcher with libasync",
    "copyright": "Copyright © 2017, erdem",
    "authors": ["erdem"],
    "dependencies": {
        "libasync": { "path": "../libasync" }
    }
}
4. Derlemek için ise kütüphaneyi şuradan çekip bir üst dizine libasync içine açıyoruz.

5. Kafa karıştırmamak için yazıyorum, derlenirken sadece source dizini ile şu 2 dosya yeterliymiş: dub.json ve ws2_32_ex.lib (sanırım bu Windows OS kullanıcıları için linking yapıyor).

6. Son aşama dub veya dub run komutunu vermek, hepsi bu kadarmış :p

Dilerseniz libasync kütüphanesinin dizini içinde de aynı komutu verebilirsiniz. Böylece async.lib önceden oluşuyor. Zaten DUB, ilk olarak kütüphanenin derlenip derlenemediğine bakıyor ve benim Windows sistemim için bunu build dizin içinde 8.655.872 bayt boyutunda oluşturuyor. Erdem'in uygulaması ise 3.575.876 bayt. Niye bu kadar fazla acaba?

Dip Not: Anlamak için app.d dosyasının ismini değiştirdiğimde 893.952 bayt boyutunda watchdogdir.lib oluşturuyor. Demek ki bu bizim libasync kütüphansinden gelen.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj 2 defa değişti; son değiştiren: Salih Dinçer; zaman: 2017-08-30, 23:11.
erdem (Moderatör) #13
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Anladığım kadarıyla bunu vibe.d ve dub ile birlikte kullanıyoruz; derlemek için dub'ı nasıl kullanmalıyız?

Salih'cim açıklamalar için teşekkürler. Ben basitçe make kullanıyorum.

Daha sonradan yaptığım uygulamalar çorba olmasın diye belgeler dizininde oluşturmuştum.

$ git clone https://github.com/etcimon/libasync.git
$ cd libasync
$ dub

Sonra bu kütüphane memutils diye bir kütüphaneye gereksinim duyuyormuş

$ git clone https://github.com/etcimon/memutils
$ cd memutils
$ dub

Ben bu kütüphaneleri kullanmak için gene Belgeler klasöründe ddili diye bir klasör ve bu klasörün içinde de import ve lib dizini oluşturmuştum.

Basitçe tüm kütüphane dosyaları lib klasörünün içine kaynak dosyalar da import klasörü içine gidiyor.

$ cd Belgeler/ddili/lib/
$ ls -a
.  ..  libasync.a  libmemutils.a

Sonra gene memutils için örnek verecek olursak. Memutils kütüphanesinin source dizininde bulunan tüm kaynak klasörünü ddili --> import klasörüne kopyalıyoruz.

Make kütüğü de şu şekilde olabilir. (İsmi Makefile)
KAYNAK := \
    bekçi.d \

SECENEKLER=-I../../ddili/import
KUTUPHANE= -L-l:libasync.a -L-l:libmemutils.a
EKSECENEKLER=
KUTUPHANE_DIZNI=-L-L../../ddili/lib

all: bekci

bekci:$(KAYNAK)
    dmd ${KAYNAK} ${SECENEKLER} ${EKSECENEKLER} ${KUTUPHANE_DIZNI}  ${KUTUPHANE} -of$@

temizle clean:
    rm -f *.o *.d~ *.py~ *.c~ *.pyc *.# *.d# Makefile~
    find . -maxdepth 1 ! -name 'sil' -perm +100 -type f -delete

Burada kütüphane dizinlerini göreceli olarak ../../ [bulunduğum klasörün iki üstünde] şeklinde belirttim. Ama sanırım tam dizin yolu da belirtilebilir.

Ufak değişiklik olsa da programın tamamını tekrar yazıyorum.

import std.stdio: writeln;
import std.algorithm: canFind;
import std.datetime: SysTime;
import std.datetime: Clock;
import std.format: format;
 
import libasync;
import libasync.watcher;
import libasync.threads;
 
shared static ~this() { destroyAsyncThreads(); }
 
struct Zaman
{
    SysTime zaman;
    ubyte saniye, dakika, saat;
    this (SysTime zaman)
    {
        this.zaman = zaman;
        this.saniye = zaman.second;
        this.dakika = zaman.minute;
        this.saat = zaman.hour;
    }
 
    string toString()
    {
        return format("%02s:%02s:%02s", this.saat, this.dakika, this.saniye);
    }
}
 
struct Dosya
{
    string isim;
    Zaman[string] olay;
 
    this (DWChangeInfo değişiklik)
    {
        this.isim = değişiklik.path();
 
        string olay;
 
        switch (değişiklik.event)
        {
        case DWFileEvent.CREATED:
            olay = "oluşturuldu";
            break;
        case DWFileEvent.DELETED:
            olay = "silindi";
            break;
        case DWFileEvent.MODIFIED:
            olay = "değişti";
            break;
        case DWFileEvent.MOVED_FROM:
            olay = "taşındı";
            break;
 
        default:
            break;
        }
        auto zaman = Zaman(Clock.currTime());
        this.olay[olay] = zaman;
    }
 
    void olayEkle(DWChangeInfo değişiklik)
    {
        string olay;
 
        switch (değişiklik.event)
        {
        case DWFileEvent.CREATED:
            olay = "oluşturuldu";
            break;
        case DWFileEvent.DELETED:
            olay = "silindi";
            break;
        case DWFileEvent.MODIFIED:
            olay = "değişti";
            break;
        case DWFileEvent.MOVED_FROM:
            olay = "taşındı";
            break;
 
        default:
            break;
        }
        auto zaman = Zaman(Clock.currTime());
        this.olay[olay] = zaman;
    }
}
 
Dosya[] dosyalar;
 
void dizindeDeğişiklikOldu(DWChangeInfo değişiklik)
{
    if (!canFind(değişiklik.path(), "#")
        && !canFind(değişiklik.path(), "~"))
    {
        bool dosyaKayıtlı = false;
        int i = 0;
 
        for (; i < dosyalar.length; ++i)
        {
            if (canFind(dosyalar[i].isim, değişiklik.path()))
            {
                writeln(dosyalar[i].isim, " dosyası zaten kayıtlıymış");
                dosyaKayıtlı = true;
                break;
            }
 
        }
 
        if (dosyaKayıtlı)
        {
            writeln("Olay ekle : ", değişiklik.event);
            dosyalar[i].olayEkle(değişiklik);
        }
 
        else
        {
            writeln("Olay ilk kez : ", değişiklik.event);
            dosyalar ~= Dosya(değişiklik);
        }
 
    }
 
    foreach (dosya; dosyalar)
    {
        writeln (dosya);
        writeln ("Anahtar ", dosya.olay.keys);
    }
 
}
 
void main()
{
    auto olayDöngüsü = getThreadEventLoop();
 
    auto bekçi = new AsyncDirectoryWatcher(olayDöngüsü);
 
    DWChangeInfo[8] değişiklikBilgisi;
 
    bekçi.run(
    {
        DWChangeInfo[] değişiklikler = değişiklikBilgisi;
 
        uint sayaç;
 
        do
        {
            sayaç = bekçi.readChanges(değişiklikler);
 
            foreach (i; 0 .. sayaç)
            {
                dizindeDeğişiklikOldu(değişiklikler[i]);
            }
        } while (sayaç > 0);
    });
 
    bekçi.watchDir("ilk");
 
    writeln("Olay döngüsü çalışıyor. ilk dizininde bir dosya kaydedin");
 
    while (olayDöngüsü.loop())
        continue;
 
    writeln("Olay döngüsünden çıkıldı");
}

Programı derlemek için de basitçe make komutunu kullanıyoruz.
erdem (Moderatör) #14
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Peki diyelim ki uygulamamız aldığı bu dosya verilerini başka bir uygulamaya aktarmaya çalışıyor.

    if (geçenSaniye > 5)
    {
        auto kopyala = spawnProcess("./kopyala");
        writeln (kopyala);
        scope(exit) wait(kopyala);
    }

Bu örnekte Dosya[] dosyalar değişkenini nasıl diğer uygulamaya gönderebiliriz.
acehreli (Moderatör) #15
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
nasıl diğer uygulamaya gönderebiliriz.

Inter-process communication yöntemlerinden birisiyle:

  https://en.wikipedia.org/wiki/Inter-process_communication

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-17, 16:51:43 (UTC -08:00)