Laden...

Ausgewählte Dateien überwachen

Erstellt von Stefanie vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.275 Views
S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren
Ausgewählte Dateien überwachen

ich möchte mit dem FileSystemWatcher nur die Files überwachen, welche ich im Programm auswähle.

mein Code:


private void Form1_Load(object sender, EventArgs e)
        {
            String Zeile;
            
            if (File.Exists(filename))
            {
                StreamReader reader = new StreamReader(filename);
                Zeile = reader.ReadLine();
                if (Zeile != null)
                {
                    toolStripBtnAendern.Enabled = true;
                }
                reader.Close();
            }

            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = @"C:\Documents and Settings\venini-1\Desktop\Daten\Visual Studio 2005";
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            watcher.Filter = "*.txt";

            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            watcher.EnableRaisingEvents = true;
        }

        private void OnChanged(object source, FileSystemEventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            textBoxProtokoll.Text = textBoxProtokoll.Text + DateTime.Now.ToShortDateString() + "    " + DateTime.Now.ToLongTimeString() + "    " + e.ChangeType + "    " + e.FullPath + "\r\n";
        }

        private void OnRenamed(object source, RenamedEventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            textBoxProtokoll.Text = textBoxProtokoll.Text + DateTime.Now.ToShortDateString() + "    " + DateTime.Now.ToLongTimeString() + "    " + "Renamed    " + e.OldFullPath + "    to    " + e.Name + "\r\n";
        }


wie schaff ich es nun, ausgewählte Dateien zu überwachen?
kann weder mehrere Pfads engeben, noch mehrere Filter...

Danke für eure Hilfe!

P
70 Beiträge seit 2006
vor 17 Jahren

Also kannst du dein Problem mal anhand von Codestellen genauer Beschreiben ?

So wie es aussieht dein geposteter Code eine kleine Modifikation aus der MSDN und deshalb kann ich fast gar nicht glauben das das nicht funktioniert (o:

Meinst du mit Filter den NotifyFilter oder den FileExtensionFilter ?

Ich denke so mehrere Pfade gehen nicht so einfach, aber du kannst dir doch eine eigene Klasse zum Überwachen bauen die du dann mehrmals erstellst mit verschiedenen Pfaden. Als Event kannst du ja dann immer auf die gleichen methoden verweisen.

Wäre mein Ansatz, aber ich kenn hier min. einen im Forum der sicher ne bessere Lösung hat gg

Grüße

plucked

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

ich möchte die Pfadangabe und den Filter dynamisch definieren, das ist schon alles, hab keine ahnung, wie das aussehen soll...

die ideen fehlen mir...

M
1.439 Beiträge seit 2005
vor 17 Jahren

welche Ideen?

FileSystemWatcher hat doch string-Properties für den Filter und den Pfad.
Da musst halt statt @"C:..." z.B.: einen selbst generierten Pfad verwenden.

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

ja, das ist schon klar... aber wenn ich mehrere Pfade habe, die ich angeben muss, was mach ich dann?

85 Beiträge seit 2006
vor 17 Jahren

Ähm also für die Enum stehen im Regelfall Werte die man beliebig kombinieren kann.
Die Members des NotifyFilters haben jeweils Bit's als Wert die als Zahl dargestellt werden. Die Enums sind nur die Mappings.

In der MSDN stehen auch die Passenden Informationen

Attributes = 4
CreationTime = 64
DirectoryName = 2
FileName = 1
LastAccess = 32
LastWrite = 16
Security = 256
Size = 8
None = 0

Um auf LastAccess,LastWrite,FileName und DirectoryName zu reagieren würde die Angabe von 32+16+1+2=51 reichen. Die Angabe von 48 würde bedeutet das man nur auf LastAccess und LastWrite reagiert.

Somit kannst du den ganzen kram beliebig kombinieren. (Basis ist immer 0)

watcher.NotifyFilter = 51

Die passenden Handles kann man entweder mit AddHandler/RemoveHandler anlegen/entfernen oder man läßt sie stehen und wertet die ergebnisse einfach nicht aus.

Gruß Floyd

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

T
433 Beiträge seit 2006
vor 17 Jahren

mehrere FileSystemWatcher nutzen? 🙂

Gruß,
Tom

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

hallo Tom!

das heisst, ich muss für jede Datei, die ich überwachen möchte einen eigenen Watcher erstellen muss??

geht das nicht einfacher?

85 Beiträge seit 2006
vor 17 Jahren

Original von marsgk
FileSystemWatcher hat doch string-Properties für den Filter und den Pfad.
Da musst halt statt @"C:..." z.B.: einen selbst generierten Pfad verwenden.

nein nicht ganz - für den Filter stimmt das nicht. Der Filter ist kein string-Propertie sondern ein enum.

Nachtrag: Achso jetzt hab ich verstanden 😁 Nicht die Notification-Filter sondern die File-Filter sind gemeint. Sorry.

Ähm die File-Filter kann man auf jedenfall mit komma trenne.

.Filter = "File.txt,File2.txt,File12.txt" 

das sollte gehen.

Original von Stefanie
ja, das ist schon klar... aber wenn ich mehrere Pfade habe, die ich angeben muss, was mach ich dann?

ähm, mit komma (,) trennen?

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

nee, das mit den Kommas funktioniert nicht beim File-Filter...

S
8.746 Beiträge seit 2005
vor 17 Jahren

Nirgends in .NET funktionieren mehrere File-Filter in einer Anfrage. Scheint Methode.

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

Hallo svenson!

also muss ich doch für jedes File einen Watcher erstellen??

85 Beiträge seit 2006
vor 17 Jahren

Hmm stimmt-funktioniert nicht 🙁

ja, dann musst du mehrere Instanzen ableiten wobei aber alle events der Instanzen vom den selben Funktionen gehandelt werden.

Gruß Floyd

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

hast du ein kleines Beispiel? kann mir nicht vorstellen, was du meinst, bin anfänger...=)

85 Beiträge seit 2006
vor 17 Jahren

Ähm gut ich versuch mich mal in C# - normalerweise schreib ich VB.Net

Also du hast ein Array aus Strings mit dem Filename und dem Pfad.

FileArray(0,0)=Pfad (Ordner)
FileArray(0,1)=Name der Datei

oky?

FileArray(0,0)="C:\test"
FileArray(0,1)="C:\test\testdatei.x"
FileArray(1,0)="C:\test"
FileArray(1,1)="C:\test\testdatei2.x"
FileArray(2,0)="C:\test"
FileArray(2,1)="C:\test\testdatei3.x"

(Ähm ich bleib doch lieber bei VB.Net - es zu überstetzen sollte nicht schwer sein aber bis ich mir jetzt die entsprechenden gegenstücke rausgesucht habe dauert es zu lange)

Dim objFileSystemWatchers as New ArrayList

for i as int16 = 0 to FileArray.ubound(0)
  Dim objwatcher as new FileSystemWatcher()
  objwatcher.Path=FileArray(i,0)
  objwatcher.NotifyFilter=51
  objwatcher.Filter=FileArray(i,1)
  
  objwatcher.Changed += new FileSystemEventHandler(OnChanged)
  objwatcher.Created += new FileSystemEventHandler(OnChanged)
  objwatcher.Deleted += new FileSystemEventHandler(OnChanged)
  objwatcher.Renamed += new RenamedEventHandler(OnRenamed)
  objwatcher.EnableRaisingEvents = true

  objFileSystemWatchers.Add(objwatcher)
next

Was passiert hier nun?

In der ersten Zeile wird ein Objekt für Typ ArrayList angelegt. Dieses speichert nacher alle FileSystemwatcher objekte.
Anschließend wir in einer schleife alle einträge des filearrays durchgegangen und ein neuer filesystemwatcher wird angelegt und in der Arraylist gespeichert.

Die Zeilen "objwatcher.Changed += new FileSystemEventHandler(OnChanged)" und folgende sind dazu da um zu sagen: "Wenn sich was ändern dann führe folgende funktion aus (Funktion: Onchanged)"

Das heißt egal ob bei der ersten,zweiten oder dritten datei sich was ändert, es wird immer OnChanged oder OnRenamed aufgerufen obwohl dieses Event (also die benachrichtung das sich was geändert hat) von 3 verschiedenen filesystemwatchern kommt.

ich hoffe das hilft dir weiter

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

thanks a lot!

85 Beiträge seit 2006
vor 17 Jahren

np 😁 freut mich sehr wenn ich helfen konnte

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

S
Stefanie Themenstarter:in
62 Beiträge seit 2006
vor 17 Jahren

ja, du konntest mir sehr helfen...

eine frage habe ich allerdings noch:

was machst du mit: FileArray.ubound(0) ?

85 Beiträge seit 2006
vor 17 Jahren

Das steht dafür das ich den höchsten index aus dem array bekommen möchte.

Es gibt LBound und UBound = LowBound und UpperBound

LBound gibt in einem Array immer die 0 Zurück - UBound gibt dann LBound+Anzahl an Einträgen - 1 zurück. Bei 3 Einträgen würde eine 2 bei UBound rausbekommen.

Ich glaube in C# ist das Length oder Range.

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net