C dili ile dosyada değişiklik kontrolü

Başlatan fghty, 18 Eylül 2012 - 17:58:26

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

fghty

Elimizde deneme.txt dosyası var olsun bu dosyada değişiklik olduğu anda bana bildirecek yöntem var mı? Yani dosyada değişiklik kontrol edebiliyor muyuz? Sonsuz döngüyle kontrol olabilir ama bilgisayar kasılır sanırsam.

Not: Buna benzer bi soruyu python bölümünde sormuştum ama çözüm bulamamıştım bu yüzden çözümü C de aramaya başladım. :)

travego0403

İstediğiniz sanırım şu. Denemedim sadece google'dan aradım.  :)
http://stackoverflow.com/questions/931093/how-do-i-make-my-program-watch-for-file-modification-in-c

Platform bağımsız bir şey yapmak istiyorsanız Qt sizin için aranılan ilaç olacaktır. İsterseniz Python ile de kullanabilirsiniz sanırım.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sem

C bölümünde aritmetik oyun var.

Bu oyunu inceleyerek örnek kod edinebilirsiniz... stdin yerine istediğiniz dosyayı dinlemeniz gerekli elbette.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

fghty

@travego0403: Hocam dediğiniz gibi ı konuda bişehler anlatmışlar ama ingilizcem o kadar iyi olmayınca tam anlayamadım.
@sem0900: Hocam c bilgim yok denecek kadar az ondan kodu anlayamadım.

Benim asıl bu soruyu sorma amacım c de dosya izleme varsa modül şeklinde c ile yazıp daha sonra pyd yaparak pythonda modül olarak kullanmayı denemekti. Ama daha c de dosya izleme işini çözemedim. :)

travego0403

#4
İngilizce yoksa çok alengirli şeylerde yapmak yok. :) Malesef düzen bu. :( Benimde İngilizce düzeyim çok iyi değil ama teknik belgeleri okumak için yetiyor.

C bilginiz ne düzeyde bilmiyorum ama şöyle bir örnek buldum. Gerçekten güzel bir örnek. Örneği kitaptan aldığım için bazı kitaba özel kısımlar vardı, onları ayıkladım. Hata mesajlarının daha anlaşılır gözükmesi "errno" değişkeninin ayarlanması ve gösterilmesi gibi.  Bu haliyle kendi başına çalışabilir durumda. Örneği anlamak için sadece C bilgisinin yanında biraz sistem programlama hakkında da bilgi sahibi olmak gerekiyor. read() nedir? Uç birim argümanları nasıl kullanılır? gibi.

Örneğin çalışma prensibi derledikten sonra uç birimde çalıştırırken izlenecek olan dosya ya da dizini argüman olarak veriyoruz. Örneğin
./izle deneme.txt
gibi. Program da dosyanın izlemeye alındığını söylüyor ve bekliyor. Eğer uç birimi kapatmadan dosya da değişiklik yapar ve kaydederseniz, uç birimde yaptığınız değişiklikleri göreceksiniz. Bunlar basit İngilizce kelimeler olduğu için anlaşılıyor. İsterseniz kodlara müdahale ederek daha anlaşılabilir hale getirebilirsiniz.

Python'a aktarılabilir mi bilmiyorum. Pythonda bildiklerim temel şeyler. Böyle C dosyası gömme gibi işlemler nasıl yapılır bilmiyorum.

#include <sys/inotify.h>
#include <limits.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
static void displayInotifyEvent(struct inotify_event *i)
{
    printf("    wd =%2d; ", i->wd);
    if (i->cookie > 0)
        printf("cookie =%4d; ", i->cookie);
       
    printf("mask = ");
    if (i->mask & IN_ACCESS)         
        printf("IN_ACCESS ");
    if (i->mask & IN_ATTRIB)
        printf("IN_ATTRIB ");
    if (i->mask & IN_CLOSE_NOWRITE)
        printf("IN_CLOSE_NOWRITE ");
    if (i->mask & IN_CLOSE_WRITE)
        printf("IN_CLOSE_WRITE ");
    if (i->mask & IN_CREATE)
        printf("IN_CREATE ");
    if (i->mask & IN_DELETE)
        printf("IN_DELETE ");
    if (i->mask & IN_DELETE_SELF)
        printf("IN_DELETE_SELF ");
    if (i->mask & IN_IGNORED)
        printf("IN_IGNORED ");
    if (i->mask & IN_ISDIR)
        printf("IN_ISDIR ");
    if (i->mask & IN_MODIFY)
        printf("IN_MODIFY ");
    if (i->mask & IN_MOVE_SELF)
        printf("IN_MOVE_SELF ");
    if (i->mask & IN_MOVED_FROM)
        printf("IN_MOVED_FROM ");
    if (i->mask & IN_MOVED_TO)
        printf("IN_MOVED_TO ");
    if (i->mask & IN_OPEN)
        printf("IN_OPEN ");
    if (i->mask & IN_Q_OVERFLOW)
        printf("IN_Q_OVERFLOW ");
    if (i->mask & IN_UNMOUNT)
        printf("IN_UNMOUNT ");

    printf("\n");
    if (i->len > 0)
        printf("      name = %s\n", i->name);

}
#define BUF_LEN (10 * (sizeof(struct inotify_event) + NAME_MAX + 1))
int main(int argc, char *argv[])
{
    int inotifyFd, wd, j;
    char buf[BUF_LEN];
    ssize_t numRead;
    char *p;
    struct inotify_event *event;
    if (argc < 2 || strcmp(argv[1], "--help") == 0){
        printf("%s pathname... \n", argv[0]);
        return 0;
    }

    inotifyFd = inotify_init();
    if (inotifyFd == -1){
        printf("inotify_init");
        return 0;
    }
    for (j = 1; j < argc; j++) {
        wd = inotify_add_watch(inotifyFd, argv[j], IN_ALL_EVENTS);
        if (wd == -1)
            printf("inotify_add_watch");

        printf("Watching %s using wd %d\n", argv[j], wd);
       
       
    }
    for (;;) {   
        numRead = read(inotifyFd, buf, BUF_LEN);
        if (numRead == 0)
            printf("read() from inotify fd returned 0!");

        if (numRead == -1)
            printf("read");
        printf("Read %ld bytes from inotify fd\n", (long) numRead);

        for (p = buf; p < buf + numRead; ) {
            event = (struct inotify_event *) p;
            displayInotifyEvent(event);

            p += sizeof(struct inotify_event) + event->len;
        }
    }
    exit(EXIT_SUCCESS);
}




Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 20 Eylül 2012 - 12:08:17

Bunlar de ne böyle dersen şöyle bir şey buldum. Sanırım sizin yapmak istediğinizi yapmış birileri. "inotify" Python'a eklemşler. Belki kodlardan bir şeyler çıkarabilirsin.
Wiki bölümünde küçük örnekler, belgeler mevcut.
https://github.com/seb-m/pyinotify
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman