Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
14.08.2008, 07:57
Deathstar



Hallo zusammen,

ich bräuchte eine kleine Applikation (auf Grund der Skriptsprache und somit leichten Modifikationsmöglichkeiten würde ich zu Java tendieren):

1. Das Prog muss einen Ordner (bzw. lediglich zwei Dateien in einem Ordner) live überwachen. Dahingehend, ob sich die Datei verändert hat (ein anderes Prog hängt alle paar Minuten eine weitere Zeile an).

2. Wenn sich beide Dateien geändert haben soll es ein anderes Skript (VB) aufrufen.

3. Das Programm darf sich dann nicht beenden, sondern muss permanent fortlaufen (für die nächste überprüfung).

Nun meine Frage: Wo fange ich an, nach welchen Stichworten muss ich googlen, wer hat ne art grundgerüst, dass ich anpassen kann?

Vielen Dank :)

--

zum Seitenanfang zum Seitenende Profil || Suche
001
14.08.2008, 11:37
Kriz



Java dafür zu nehmen ist wie mit Kanonen auf Spatzen schießen (die VM dahinter ist speicherhungrig). Allerdings kann man dort elegant Threading betreiben, was deinem Überwachungstool entgegenkommt. Ansonsten... kann VB mittlerweile kein Threading? Sonst bleiben noch diverse C/C++ APIs inkl. QT oder wxWidgets, meinetwegen auch C#, Delphi oder WinAPI/MFC...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
002
14.08.2008, 11:47
KhanRKerensky



0. Java ist keine Skriptsprache. Für sowas würde ich Python nehmen. Würd mich allerdings nicht wundern, wenn das auch mit ner .bat ginge.

1. os.path ist dein Freund. Damit kann man sich sowohl Ordner durchlaufen (ich weiß ja nicht wie komplex dein Problem ist), als auch die Zeit der letzten Modifikation einer Datei abrufen.

2. os.system() Wobei ich nicht weiß wie man ein VB Skript aufruft.

3. Eine einfache Schleife wird da wohl reichen.

Nützt dir wohl recht wenig, wenn du kein Python kannst.

--

"[...] you're going to burn in a very special level of Hell. A level they reserve for child molesters and people who talk at the theater." - Book

zum Seitenanfang zum Seitenende Profil || Suche
003
14.08.2008, 13:01
Bluthund



In C mit WinAPI:
Quellcode:#include <stdio.h>
#include <windows.h>

#define SLEEP_TIME        5000    // wait 5 seconds before redoing filechecks

#define VBSCRIPT_TO_EXECUTE "C:/bla.vbs"

int main()
{
    char *filenames[] = {
        "C:/foo.txt",
        "C:/bar.txt",
    };

    int i, everything_changed;

    int no_of_files = sizeof(filenames)/sizeof(char*);

    FILETIME *changetimes = malloc(sizeof(FILETIME)*no_of_files);
    int *changed = malloc(sizeof(int)*no_of_files);

    if (NULL == changetimes || NULL == changed)
    {
        fprintf(stderr, "FATAL: Couldn't allocate memory\n");
        return -1;
    }

    // structure for storing file attributes
    WIN32_FILE_ATTRIBUTE_DATA fileinfo;

    // initialize
    for (i=0; i<no_of_files; ++i)
    {
        memset((void*)&fileinfo, 0, sizeof(WIN32_FILE_ATTRIBUTE_DATA));

        GetFileAttributesEx(filenames[i], GetFileExInfoStandard, (void*)&fileinfo);

        changetimes[i] = fileinfo.ftLastWriteTime;
        changed[i] = 0;
    }

    // main loop
    do
    {
        // check all files
        for (i=0; i<no_of_files; ++i)
        {
            memset((void*)&fileinfo, 0, sizeof(WIN32_FILE_ATTRIBUTE_DATA));

            GetFileAttributesEx(filenames[i], GetFileExInfoStandard, (void*)&fileinfo);

            if (    fileinfo.ftLastWriteTime.dwHighDateTime > changetimes[i].dwHighDateTime ||
                    fileinfo.ftLastWriteTime.dwLowDateTime > changetimes[i].dwLowDateTime )
            {
                    changed[i] = 1;

                    changetimes[i].dwHighDateTime = fileinfo.ftLastWriteTime.dwHighDateTime;
                    changetimes[i].dwLowDateTime = fileinfo.ftLastWriteTime.dwLowDateTime;
            }
        }

        // connect change values
        for (everything_changed=1,i=0; i<no_of_files; ++i) { everything_changed &= changed[i]; }

        // if every file has changed at least once
        if (everything_changed)
        {
            // execute VBScript *uahh*
            ShellExecute(NULL, NULL, VBSCRIPT_TO_EXECUTE, NULL, NULL, SW_SHOWNORMAL);

            everything_changed = 0;

            memset((void*)changed, 0, sizeof(int)*no_of_files);
        }

        // wait a short period of time
        Sleep(SLEEP_TIME);
    } while (1);

    return 0;
}
Tut genau das, was du oben beschrieben hast. Beenden des Programms sporadisch über CTRL+C oder ProcessKill, weil ich keine Lust hatte da jetz noch nen Thread für die Eingaben zu machen :)
Java als Skriptsprache zu benennen ist schon ziemlich arg...

@Kriz: Wofür Threads bei dem Problem (außer evtl Nutzer-Eingaben)???

Ansonsten wäre halt wie Khan schon sagte ne Skriptsprache ne gute Alternative. BatchFile wahrscheinlich eher weniger, aber Sachen wie Python, PHP und Konsorten können das ganze ohne OS-Schweinkram (Oder halt nen entsprechendes Framework in C/C++).

edit: aus \\ / gemacht weils schöner aussieht :)

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 14.08.2008 um 13:06 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
14.08.2008, 14:31
Deathstar



Perfekt, werde es direkt mal testen wenn ich aus dem meeting hier raus bin =D

--

zum Seitenanfang zum Seitenende Profil || Suche
005
14.08.2008, 19:06
CPoly



Weshalb ruft das Programm, welches die Zeile anhängt, nicht selbst das VB Programm auf?

--

zum Seitenanfang zum Seitenende Profil || Suche
006
14.08.2008, 19:58
Deathstar



Weil es das nicht kann, kann lediglich nen export fahren (sry, darf nicht detailierter werden).

--

zum Seitenanfang zum Seitenende Profil || Suche
007
14.08.2008, 20:27
Bluthund



Ich greif mal CPolys Idee auf:
Warum lässt du die Überwachung nicht im VBScript laufen? Bin da jetz nich so firm aber ich denke mal, dass es da Möglichkeiten gibt Infos aus dem Dateisystem zu holen und Schleifen wirds wohl auch geben.

Achja und zum Code oben noch ne kleine Bemerkung:
"Mind the gap" - Soll heißen je nach Filesystem kann die Auflösung der Schreibzeit einer Datei variieren

Zitat:
http://msdn.microsoft.com/en-us/library/ms724284(VS.85).aspx
For example, on NT FAT, create time has a resolution of 10 milliseconds, write time has a resolution of 2 seconds
Also wäre es sinnfrei die Wartezeit der Schleife unter diesen Wert zu verkürzen.

edit: Grad noch bisschen rum gegoogelt:
http://www.devguru.com/technologies/vbscript/quickref/file.html
Ich denk mal das wäre definitiv die beste Variante, da es nicht noch ne zusätzliche Instanz (sprich: obiges Programm o.ä.) erfordert.

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-


Dieser Beitrag wurde am 14.08.2008 um 20:56 von Bluthund bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
15.08.2008, 10:30
Deathstar



hmm, mir kommt gerade eine idee:

in vbscript kann ich die dateigröße bytegenau rausbekommen, sprich, darüber überprüfen... werde ich mal testen. danke für den gedanken.

und bluthund: vielen dank, das prog tut genau das, was es soll :)

*gedanke an mich selbst* eine nur-vb-script-basierende-lösung ist wesentlich flexibler....

*edit* SOOOOOOO:

nun das ganze mal quick-n-dirty in vbscript

Quellcode:'Fehlermeldungen unterdrücken
On Error Resume Next

'Variablen und Konstanten festlegen
Const Datei1 = "censored1"
Const Datei2 = "censored2"
Const Datei3 = "export.log"

Set fso = CreateObject("Scripting.FileSystemObject")
Set FileSize1 = FSO.GetFile(Datei1)
Set FileSize2 = FSO.GetFile(Datei2)

size1 = FileSize1.Size
size2 = FileSize2.Size

Set FileSize1 = NOTHING
set FileSize2 = NOTHING

'Endlosschleife für den Hintergrund
do while 1
    Set FileSize3 = FSO.GetFile(Datei1)
    Set FileSize4 = FSO.GetFile(Datei2)
    'Überprüfung ob sich beide Dateien verändert haben, wenn ja, automatisch exportieren
    If FileSize3.Size <> size1 then
        If FileSize4.Size <> size2 then
            'Einlesen der zwei Channel-Dateien
            Text1 = Split(fso.OpenTextFile(Datei1,1).ReadAll, vbCrLF)
            Letzte1 = Text1(UBound(Text1))
            Text2 = Split(fso.OpenTextFile(Datei2,1).ReadAll, vbCrLF)
            Letzte2 = Text2(UBound(Text2))

            'Export der jeweils letzten Zeile in eineseparate Datei
            Set Text3 = fso.OpenTextFile(Datei3,8)
            Text3.WriteLine("Channel-A: "& Letzte1 & " Channel-B: "& Letzte2)
            Text3.Close

            
            size1 = FileSize3.Size
            size2 = FileSize4.Size
        End If
    Elseif FileSize4.Size <> size2 then
        If FileSize3.Size <> size1 then
            'Einlesen der zwei Channel-Dateien
            Text1 = Split(fso.OpenTextFile(Datei1,1).ReadAll, vbCrLF)
            Letzte1 = Text1(UBound(Text1))
            Text2 = Split(fso.OpenTextFile(Datei2,1).ReadAll, vbCrLF)
            Letzte2 = Text2(UBound(Text2))

            'Export der jeweils letzten Zeile in eineseparate Datei
            Set Text3 = fso.OpenTextFile(Datei3,8)
            Text3.WriteLine("Channel-A: "& Letzte1 & " Channel-B: "& Letzte2)
            Text3.Close

            
            size1 = FileSize3.Size
            size2 = FileSize4.Size
        End If
    End If
    
    Set FileSize3 = NOTHING
    Set FileSize4 = NOTHING
    
    '90 Sekunden lang warten bis zum nächsten Durchlauf
    WScript.Sleep 90000
loop
es tut seinen zweck :)

--


Dieser Beitrag wurde am 15.08.2008 um 15:23 von Deathstar bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche