Autor Beitrag
ArminF
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 18.08.09 11:47 
Hallo zusammen,

nach googeln und internetstöbern hab ich immer noch ein Problem mit dem Filesystemwatcher.

Kurze Darstellung des Problems:
Eine Datei wird in einem Verzeichnis erstellt, diese wird von nem Programm automatisch gelesen und daraus dann die Antwortdatei erstellt.

Dazu hab ich eine Klasse Data, dort gibt es die Methoden setServerRequest und getServerResult.
Bei setServerRequest bau ich mir die Datei zusammen, speicher sie im entsprechende Verzeichnis, das Programm holt sie und wandelt die Datei um. Bis daher gibts auch keine Probleme.
Im getServerResult will ich nun die erstellte Datei lesen, hab da bis jetzt immer mit nem Sleep gearbeitet. Aber wenn das Programm länger rechnet, ist die Datei nicht da und es wirft nen Fehler.

Jetzt gibts ja den Filesystemwatcher. Aber wo in der Klasse bau ich den ein, damit er prüft, ob die Datei changed bzw. created wurde?
Hoff das hab ich jetzt einigermassen verständlich formuliert und irgendwer kann mir ein wenig helfen.

Armin
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Di 18.08.09 14:44 
Hallo Armin,

wieso machst du das überhaupt über das FileSystem und läßt die zwei Programmteilen nicht direkt miteinander kommunizieren? Da enstehen soviel Fehlerquellen :((

Wegem FileWatcher den kannst du konfigurieren auf welche Events du informiert werden willst (müssten nun nachschauen wie genau, aber das kannst du ja auch ;) - falls du Lösung wirklich übers FileSystem muss).

Ansonsten frag einfach nochmal...

Gruß Daniel
ArminF Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 18.08.09 14:54 
Ich denk mal, dass muss über den Filesystemwatcher laufen, weil die Dateien ja von einem externen Programm verarbeitet werden.
Oder lieg ich da falsch.
Mit den Benutzereingaben erzeuge ich eine Datei, die das externe Programm automatisch abholt und das Ergebnis in einen voreingestellten Ordner schreibt.
Da kann ich doch zwischen den Programmteilen nicht direkt mit kommunizieren.
Tüftel jetzt schon ne Weile mit den Events vom Filesystemwatcher rum, aber der liefert mir nicht das gewünschte Ergebnis :-(
Hier mal ein kurzer Ausschnitt:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
public class Data()
{
    public event FileChanged onFileChanged;

    public Data()
    {
      //Löschen der Files - damit Create-Handler funktioniert
      File.Delete(pathOUT + fileOUT);
      File.Delete(pathOUT + fileAlternates);
      SrvIN = new ServerIN();
      so = new ServerOUT();
      //Create a new FileSystemWatcher.
      FileSystemWatcher watcher = new FileSystemWatcher();
      watcher.Filter = "*.ans";
      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
      watcher.Path = pathOUT;
      watcher.EnableRaisingEvents = true;
      watcher.Changed += new FileSystemEventHandler(watcher_Changed);
      watcher.Created += new FileSystemEventHandler(watcher_Changed);
    }


    void watcher_Changed(object sender, FileSystemEventArgs e)
    {
      Console.WriteLine("A new file has been created!" + e.FullPath);
    }

    public void SetServerRequest(ServerIN si)
    {
      string firstName = "";
      string lastName = "";
      pathIN = @"MapGuide\DS_In\";
      fileIN = "Route.asc";

      // Prüfung ob Wert vorhanden ist oder nicht und in Variablen speichern
      if (si.FirstName!= null)
        FirstName= si.FirstName;
      if (si.LastName!= null)
        LastName= si.LastName;
   
     // File zur Verarbeitung erzeugen
      FileStream file = new FileStream(pathIN + fileIN, FileMode.OpenOrCreate, FileAccess.Write);
      StreamWriter sw = new StreamWriter(file);
      sw.WriteLine("[CLIENT]");
      sw.Write("REQUEST=TRUE" + "\n");
      sw.Write("Firstname=" + FirstName + "," + LastName "\n");
      sw.Write("ACTION=3");
      // Close-Operations
      sw.Close();
      file.Close();
    }

    public ServerOUT GetServerResult()
    {
      //Datei lesen
      // Sleep, der durch Filesystemwatcher evtl. überflüssig wird
      //System.Threading.Thread.Sleep(7000);
      StreamReader myFile = new StreamReader(pathOUT + fileOUT);
       ......
      return so;
    }
}

Und das wär dann der Programmteil, nur da geht er nie in den Event rein
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    private void btnCreate_Click(object sender, System.Windows.RoutedEventArgs e)
    {
      // Eingaben an Map&Guide übergeben
      ServerIN si = new ServerIN();
      si.FirstName= this.txtFirstName.Text;
      si.Lastname = this.txtLastName.Text;
      routeInfos = new MapGuide();
      routeInfos.onFileChanged += new FileChanged(routeInfos_onFileChanged);
      routeInfos.SetServerRequest(si);
      ServerOUT so = routeInfos.GetServerResult();
}

  void routeInfos_onFileChanged(object sender, ServerOut so)
    {
      Console.WriteLine("A new file has been created!");
    }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 18.08.09 17:59 
Ich denke, das Problem liegt daran, daß das 'Created'-Event für dich zu früh geschickt wird. Das externe Programm erzeugt ja die Datei (created) und danach werden dann die Daten in diese Datei geschrieben. Und du versuchst dann schon zu lesen (bzw. diese Datei zu öffnen, obwohl sie noch beschrieben wird).

Mir fällt nur ein, in regelmäßigem Abstand (alle x Millisekunden) versuchen, die Datei zu öffnen. Solange bis es klappt...

(ich denke, dazu brauchst du noch nicht einmal den FileSystemWatcher, denn du kennst doch sicherlich den Dateinamen der Ausgabedatei, oder? Also einfach Anfrage stellen, dann obige Schleife und anschließend die Datei lesen)
ArminF Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 19.08.09 10:23 
Danke, denk das war ein Teil des Problems und der andere Teil war, dass nur das renamend-Event gezündet wird. Die Datei wird von dem externen Programm anscheinend so komisch übergeben, dass nur damit funktioniert.
Wobei das mit dem Schleifenkonstrukt bestimmt der einfachere Weg gewesen wäre. Naja jetzt klappts einigermassen und ich komm weiter.
Danke für die Hilfe.
Armin