none
FileWatcher-Event Changed wird in WinForm-Applikation nicht ausgelöst.... RRS feed

  • Frage

  • Hallo

    Ich habe nach einer Idee bzw. Hilfe hier im Forum von Tom (in diesem Thread), die FileWatcher-Klasse in meine WinForm-Applikation versucht einzubauen.

    Der Hintergrund kurz erläutert: Es soll eine Excel-Datei in aus der WinForm-Applikation bearbeitet werden können - und auch das Ergebnis der Excel-Daten (sprich die komplette Datei) dann in der Datenbank dieser Applikation gespeichert werden (um später auch wieder mit Excel geöffnet und bearbeitet werden zu können).

    Jetzt habe ich den Lösungsweg eingeschlagen, beim Bearbeiten dieser Excel-Datei eine Dialogform in der Applikation zu öffnen - um den Benutzer darauf hinzuweisen, dass Dokument in Excel bearbeitet wird.

    Und dann den Filewatcher auf diese Form probiert - - doch dieser reagiert überhaupt nicht auf eine Veränderung der angegebenen Excel-Datei. Ich habe laut Beschreibung alle notwendigen Schalter und Eigenschaften des FileWatcher gesetzt; habe den Filter auf diese Datei gesetzt; aber keine Reaktion in der Form, dass das Event für Changed ausgelöst wird.

    Gibt es dazu noch etwas zum Beachten, wenn ich den FileWatcher in einer WinForm-Applikation in einer Dialog-Form anwende ??

    Vielleicht kann mir dazu bitte jemand weiterhelfen.

    Danke schon mal & schönen Gruß, Michael


    Michael Erlinger

    Samstag, 28. Februar 2015 16:43

Antworten

  • Hallo Michael,

    Windows 8 dreht etwas daran, siehe z. B. Why are FileSystemWatcher Attribute changes detected on Windows 7 but not Windows 8? Was für oben nicht zutreffen sollte (der NotifyFilter bezieht das Datum ein). Welche Office Version sollte keine Rolle spielen, denn die Datei muss geschrieben werden.

    Probleme könnte es geben, wenn es sich um einen exotischen Datenträger (mit eigenem Treiber) handelt. Auch Einflüsse eines Virenscanners, der sich mit seinem Dateifilter dazwischen drängelt, sind nicht ausgeschlossen.

    Wenn es notorisch nicht will, solltest Du überlegen, ob Du nicht mit Office Automation arbeitest, dort kann man das Speichern und Schließen über Ereignisse abfangen.

    Gruß Elmar


    • Als Antwort markiert M.Erlinger Donnerstag, 5. März 2015 10:50
    Sonntag, 1. März 2015 07:46
    Beantworter
  • Hi Michael,
    bezüglich @Office-Automation sind Office WebApps eine Betrachtung wert. Wenn der Anwender Office 2013 nutzt und Du einen SharePoint 2013 oder Office 2013 zur Verfügung hast, dann kannst Du Office Apps programmieren und im AppStore des SharePoint bereitstellen. Da braucht der Anwender nur oben unter "Store" die gewünschte App zu laden. Diese läuft dann in einem separaten Fenster und hat Zugriff auf das Office Objektmodell.

    --
    Peter

    Sonntag, 1. März 2015 17:21

Alle Antworten

  • Hallo Michael,

    sollte eigentlich, das Minimalbeispiel tut es mit Excel 2010 (wenn man speichert):

    private void button1_Click(object sender, EventArgs e) { OpenFileAndWatch(@"C:\TEMP\Test.xlsx"); } private FileSystemWatcher currentWatcher; private string currentFileName; public void OpenFileAndWatch(string fileName) { if (currentWatcher != null) { currentWatcher.EnableRaisingEvents = false; currentWatcher.Changed -= CurrentWatcher_Changed; currentWatcher.Dispose(); } this.listBox1.Items.Clear(); Process.Start(fileName); this.currentFileName = Path.GetFullPath(fileName); string directoryPath = Path.GetDirectoryName(this.currentFileName); currentWatcher = new FileSystemWatcher(); currentWatcher.Path = directoryPath; currentWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.CreationTime; currentWatcher.Changed += CurrentWatcher_Changed; currentWatcher.EnableRaisingEvents = true; } private void CurrentWatcher_Changed(object sender, FileSystemEventArgs e) { // if (this.currentFileName != null && this.currentFileName.Equals(e.FullPath, StringComparison.InvariantCultureIgnoreCase))

    if (this.IsHandleCreated) // sonst u. U. Fehler this.Invoke((MethodInvoker)delegate { MonitorChange(e); }); } private void MonitorChange(FileSystemEventArgs e) { // Anzeige in einer Listbox (Invoke) this.listBox1.Items.Add(string.Format("{0} ({1})", e.FullPath, e.ChangeType)); }

    und auch wenn das Formular via ShowDialog geöffnet ist.

    Gruß Elmar


    Samstag, 28. Februar 2015 18:18
    Beantworter
  • Hallo Elmar

    danke für Deine rasche Rückmeldung.

    Habe jetzt genau Dein Beispiel probiert - mit Excel 2013 - und leider nichts................

    Kann es am Excel 2013 liegen? Oder an Windows 8.1 ?

    Danke, Michael


    Michael Erlinger

    Samstag, 28. Februar 2015 19:13
  • Hallo Michael,

    Windows 8 dreht etwas daran, siehe z. B. Why are FileSystemWatcher Attribute changes detected on Windows 7 but not Windows 8? Was für oben nicht zutreffen sollte (der NotifyFilter bezieht das Datum ein). Welche Office Version sollte keine Rolle spielen, denn die Datei muss geschrieben werden.

    Probleme könnte es geben, wenn es sich um einen exotischen Datenträger (mit eigenem Treiber) handelt. Auch Einflüsse eines Virenscanners, der sich mit seinem Dateifilter dazwischen drängelt, sind nicht ausgeschlossen.

    Wenn es notorisch nicht will, solltest Du überlegen, ob Du nicht mit Office Automation arbeitest, dort kann man das Speichern und Schließen über Ereignisse abfangen.

    Gruß Elmar


    • Als Antwort markiert M.Erlinger Donnerstag, 5. März 2015 10:50
    Sonntag, 1. März 2015 07:46
    Beantworter
  • Hallo Elmar

    kann es sein, dass vielleicht noch Dev.Express mitspielt ? Ich verwende in dieser Applikation sämtlich Controls von DevelopExress für WinForms-Applikationen.

    @Office-Automation - ist das einfach für eine Excel-Datei einzubinden ? Oder ist dann auch vor allem Kundenseitig/Client-Seitig viel zu tun bzw. etwas anzupassen ?

    Danke & schönen Gruß, Michael


    Michael Erlinger

    Sonntag, 1. März 2015 16:34
  • Hi Michael,
    bezüglich @Office-Automation sind Office WebApps eine Betrachtung wert. Wenn der Anwender Office 2013 nutzt und Du einen SharePoint 2013 oder Office 2013 zur Verfügung hast, dann kannst Du Office Apps programmieren und im AppStore des SharePoint bereitstellen. Da braucht der Anwender nur oben unter "Store" die gewünschte App zu laden. Diese läuft dann in einem separaten Fenster und hat Zugriff auf das Office Objektmodell.

    --
    Peter

    Sonntag, 1. März 2015 17:21