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 :)
--
|
|
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)
|
|
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
|
|
Profil || Suche
|
003
14.08.2008, 13:01
Bluthund
|
In C mit WinAPI:
#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.
|
|
Profil || Suche
|
004
14.08.2008, 14:31
Deathstar
|
Perfekt, werde es direkt mal testen wenn ich aus dem meeting hier raus bin =D
--
|
|
Profil || Suche
|
005
14.08.2008, 19:06
CPoly
|
Weshalb ruft das Programm, welches die Zeile anhängt, nicht selbst das VB Programm auf?
--
|
|
Profil || Suche
|
006
14.08.2008, 19:58
Deathstar
|
Weil es das nicht kann, kann lediglich nen export fahren (sry, darf nicht detailierter werden).
--
|
|
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
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.
|
|
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
'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.
|
|
Profil || Suche
|