Autor Beitrag
SirSharp
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 18.01.20 23:47 
Hallo,

ich bin neu im Bereich C# wie auch in diesem Forum... Hallo :wave:
Dies ist mein erster Thread.

Ich wollte gerne in meiner C# Form-Anwendung mehrere Pfade überprüfen ob dort an den Dateien Änderungen vorgenommen worden sind.
Hierzu wollte ich gerne FileSystemWatcher nutzen, diesen bei Anwendungsstart für mehrere Pfade dynamisch erzeugen. (Im späteren Programmverlauf, sollen dann entsprechemde FileSystemWatcher wieder gestoppt werden und andere erzeugt werden).

Was möchte ich?
Ich möchte nun in den dynamisch erzeugten events (Watcher_Created, Watcher_Deleted, usw.) auf Komponenten (lbFileMonitor & lvFileMonitor) auf der Form1 zugreifen um dort ein Ausgabetext anzeigen zu lassen.
Console.WriteLine funktioniert hier problemlos.
Allerdings wenn ich im Code das ausgeklammerte verwende:
ausblenden C#-Quelltext
1:
lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Renamed from: " + e.OldName);					

bekomme ich diese Exception:
Zitat:
Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS0120 Für das nicht statische Feld, die Methode oder die Eigenschaft "Form1.lbFileMonitor" ist ein Objektverweis erforderlich. DevAppManager C:\Users\***\Source\Repos\test\test\test\Form1.cs 200 Aktiv

Liebe Experten, was denkt ihr wie man dies lösen kann?

Viele Grüße


Das hier habe ich bereits:
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:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
        public static string sPath_c = @"C:\";
        public static string sPath_c_windows = @"C:\windows\";
        public static string sPath_d = @"D:\";

        public Form1()
        {
            InitializeComponent();
            //File Monitor
            cbFileMonitorDir.Items.Add(sPath_c);
            cbFileMonitorDir.Items.Add(sPath_c_windows);
            cbFileMonitorDir.Items.Add(sPath_d);
            cbFileMonitorDir.SelectedIndex = 0;
            List<string> listSearchDir = new List<string>();
            foreach (object item in cbFileMonitorDir.Items)
                {
                    listSearchDir.Add(item.ToString());
                }
            StartFileMonitoring(listSearchDir);
        }

        public void StartFileMonitoring(List<string> listDir)
        {
            //FileSystemWatcher fs = new FileSystemWatcher();
            //using (FileSystemWatcher watcher = new FileSystemWatcher())
            List<FileSystemWatcher> watchers = new List<FileSystemWatcher>();
            foreach (var item in listDir)
            {
                if (Directory.Exists(item.ToString()))
                { 
                    watchers.Add(MyWatcherFatory(item.ToString()));
                }
            }
        }
        FileSystemWatcher MyWatcherFatory(string path)
        {
            FileSystemWatcher watcher = new FileSystemWatcher(path);
            watcher.Created += Watcher_Created;
            watcher.Changed += Watcher_Changed;
            watcher.Deleted += Watcher_Deleted;
            watcher.Renamed += Watcher_Renamed;
            watcher.EnableRaisingEvents = true;
            return watcher;
        }
        private static void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            FileInfo fileInfo = new FileInfo(e.FullPath);
            Console.WriteLine("File Created!! :: {0}", e.FullPath);
            //lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Created:      " + e.Name);
            //lvFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Created:      " + e.Name);
        }
        private static void Watcher_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("File Watcher_Changed!! :: {0}", e.FullPath);

            //lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Changed:      " + e.Name);
            //lvFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Changed:      " + e.Name);
        }
        private static void Watcher_Deleted(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("File Watcher_Deleted!! :: {0}", e.FullPath);

            //lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Deleted:      " + e.Name);
            //lvFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Deleted:      " + e.Name);
        }
        private static void Watcher_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine("File Watcher_Renamed!! :: {0}", e.FullPath);
            //lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Renamed from: " + e.OldName);
            //lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Renamed to:   " + e.Name);

            //lvFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Renamed from: " + e.OldName);
            //lvFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Renamed to:   " + e.Name);
        }


Moderiert von user profile iconTh69: C#- durch Quote-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4157
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: So 19.01.20 11:24 
Hallo und :welcome:

du weißt, was static bedeutet?
Entferne diese bei den Watcher-Ereignismethoden.
SirSharp Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 19.01.20 15:07 
Hallo Th69,
danke für deinen Beitrag.

Das Beispiel habe ich von diesem Beitrag: docs.microsoft.com/e...iew=netframework-4.8

Ich habe schon das static versucht gehabt wegzulassen und dann in dem jeweiligen Event auf meine Komponenten (lbFileMonitor, lvFileMonitor) die Ausgabe erfolgen zu lassen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        private static void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            FileInfo fileInfo = new FileInfo(e.FullPath);
            Console.WriteLine("File Created!! :: {0}", e.FullPath);
            lbFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Created:      " + e.Name);
            lvFileMonitor.Items.Insert(0, DateTime.Now + "  |  " + "Created:      " + e.Name); // Hier kommt die folgende Exception
        }


Jedoch bekomme ich dann diese Exception beim erstellen einer Datei:
Zitat:
Ausnahme ausgelöst: "System.InvalidOperationException" in System.Windows.Forms.dll
Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lvFileMonitor erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4157
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: So 19.01.20 15:36 
In dem Beispiel werden auch nur statische Methoden aufgerufen (Console.WriteLine).

Und die Exception zur Laufzeit kommt, weil die Ereignismethode in einem anderen Thread läuft als der UI-Thread (und Zugriffe auf UI-Komponenten dürfen nur im UI-Thread erfolgen).
Um darauf zuzugreifen, gibt es die Methode Control.Invoke, s. z.B. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).