Lösungsvorschläge

Was pasiert gerade in dem Verzeichnis?

Verzeichnis überwachen (ohne Timer)

Oftmals sehen Schnittstellen mit PC-Programmen so aus, dass Dateien in ein bestimmtes Verzeichnis abgelegt werden für weitere Verarbeitung in ein anderes System. Die PC-Programme reagieren im Allgemeinen sofort auf den Empfang der Dateien in dem Verzeichnis, die AS/400 muss aber warten bis Daten übermittelt werden.
In diesem Beispiel zeigen wir wie ein Verzeichnis überwacht werden kann. Je nach Art der Datei kann ein entsprechendes Programm die Datei übermitteln.

Dieses Beispiel geht aus von einer PC-Anwendung mit Export-Funktion um Daten zur AS/400 zu senden. Im Grunde ist es egal ob diese Daten von einem entfernten System (z.B. ftp), einer Dialoganwendung oder einem Batchprogramm zu Verfügung gestellt werden. Lediglich die Tatsache, dass eine Datei erstellt, geändert, umbenannt oder gelöscht wird, löst eine Verarbeitung aus.
Parameter erlauben die Auswahl von Verzeichnis, Dateiname (oder einem Teil des Namens) und Art der Änderung.

Technik

Üblicherweise werden zur Überwachung Timer benutzt die in regelmäßigen Abständen das Verzeichnis auf Änderungen überprüfen. In diesem Beispiel wird der "FileSystemWatcher" von Windows verwendet. Die Vorteile liegen auf der Hand:

  • Die Verarbeitung wird nur aufgerufen wenn tatsächlich Daten angeboten werden.
  • Direkt nach Empfang der Daten im Verzeichnis (ohne Verzögerung durch Timer-Intervall) werden die Daten verarbeitet.

Eine ausführliche Beschreibung des "FileSystemWatcher" finden Sie unter:

Microsoft msdn-library

Vorraussetzung

  • Microsoft Visual Studio 2003 (oder 2005)
  • Microsoft Windows 2000 / XP
  • Microsoft .Net Framework 1.1 (oder höher)
  • ASNA Visual RPG 7.1 (oder höher)

Quellcode

Using System
Using System.Drawing
Using System.Collections
Using System.ComponentModel
Using System.Windows.Forms
Using System.Data
Using System.IO

BegClass Form1 Extends(System.Windows.Forms.Form) Access(*Public)

    [+] BegSr Dispose Access(*Public)Modifier(*Overrides)
    [+] BegConstructorAccess(*Public) [...]
    [+]

    Windows Form Designer generated code

    BegSr Form1_Load Access(*Private) Event(*this.Load)
    DclSrParm sender Type(*Object)
    DclSrParm e Type(System.EventArgs)

      // Neues Überwachungsobjekt erstellen
      DclFld watcher Type(FileSystemWatcher) New()

      // Welches Verzeichnis soll überwacht werden?
      watcher.Path = "C:\Temp"

      // Welche Dateien sollen überwacht werden?
      watcher.Filter = "*.xml"

      // Welche Änderungen sollen überwacht werden?
      watcher.NotifyFilter = (NotifyFilters.LastAccess *BitOr NotifyFilters.LastWrite *BitOr NotifyFilters.FileName *BitOr NotifyFilters.DirectoryName)

      // Behandlung für Ereignisse festlegen.
      AddHandler SourceObject(watcher) SourceEvent(Created) HandlerObject(*This) HandlerSr(OnCreate)
      AddHandler SourceObject(watcher) SourceEvent(Changed) HandlerObject(*This) HandlerSr(OnChange)
      AddHandler SourceObject(watcher) SourceEvent(Deleted) HandlerObject(*This) HandlerSr(OnDelete)
      AddHandler SourceObject(watcher) SourceEvent(Renamed) HandlerObject(*This) HandlerSr(OnRename)

      // Starte Überwachung
      watcher.EnableRaisingEvents = *True

    EndSr

    BegSr OnCreate
    DclSrParm sender Type(*Object)
    DclSrParm e Type(FileSystemEventArgs)

      MsgBox Msg("Datei: " + e.FullPath + " erstellt...")

    EndSr

    BegSr OnChange
    DclSrParm sender Type(*Object)
    DclSrParm e Type(FileSystemEventArgs)

      MsgBox Msg("Datei: " + e.FullPath + " geändert...")

    EndSr

    BegSr OnDelete
    DclSrParm sender Type(*Object)
    DclSrParm e Type(FileSystemEventArgs)

      MsgBox Msg( "Datei: " + e.FullPath + " gelöscht...")

    EndSr

    BegSr OnRename
    DclSrParm sender Type(*Object)
    DclSrParm e Type(RenamedEventArgs)

      MsgBox Msg("Datei: " + e.OldFullPath + " wurde umbenannt in " + e.FullPath)

    EndSr

EndClass