Tak jsem si hrál s těma notify filtrama a zdá se, že do toho začínám pomalinku nahlížet. Přiznám se, že původně jsem si myslel, že jde o dvě zcela samostatné kategorie toho, co všechno chci hlídat. Ale až po menším bádání jsem dospěl k závěru, že se jedná o záležitosti spojené a to tak, že ve filtru si řeknu co konkrétního chsi v adresáři monitorovat (atributy souborů, názvy souborů, velikost souborů, atd..), jenomže pak u těchto jednotlivostí rozhodnu, jakou jejich událost vůbec budu zachytávat (změnu, vytvoření, zrušení,...) No a toto mne původně dost zmátlo, protože u většiny atributů je logická pouze změna (jak chcete "vytvořit" nebo "smazat" třeba čas vytvoření souboru - ten je přece svázán s jeho existencí a já jej mohu pouze změnit-kdo nyní namítne, že vytvořením souboru "vytvořím" i čas jeho vytvoření, což by ve svém důsledku mohlo být i logické, tak bohužel, takovouto událost mi "Created" aplikované na čas vytvoření souboru nezachytí!?) No ale k mému problému. Zkusil jsem tedy laborovat s různými možnostmi a dospěl jsem ke konečnému "TÉMĚŘ" funkčnímu řešení:
Public Class Form1
Private WithEvents zmenaSouboru As New System.IO.FileSystemWatcher
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
zmenaSouboru.Path = "c:\"
zmenaSouboru.IncludeSubdirectories = False
zmenaSouboru.Filter = "test.xml"
zmenaSouboru.NotifyFilter = IO.NotifyFilters.LastAccess
zmenaSouboru.EnableRaisingEvents = True
End Sub
Private Sub zmenenSoubor(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles zmenaSouboru.Changed
MsgBox(e.FullPath & " - " & e.ChangeType.ToString & " - " & e.Name)
End Sub
End Class
To téměř je tam kvůli jedné chybičce, kterou jsem objevil, a totiž, že se mi nevyvolá událost v případě, že otevřu totálně prázdný soubor a opět jako totálně prázdný jej uložím?? Jinak pokud v něm je cokoliv, byť i mezera, mohu ukládat a ukládat a vyvolá se mi 1X událost správně, a to i v případě, že jsem v souboru něco měl, smažu obsah a soubor nyní již jako prázdný uložím. Toto pro mou požadovanou funkčnost PLNĚ postačuje, protože můj soubor nebude nikdy prázdný a i kdyby, je spíše přínosem, že se nebude spouštět analýza nezměněného prázdného souboru, ale stejně to považuji za dosti zvláštní chování. Mohl by mi to někdo vysvětlit, protože takto nejsem schopen predikovat funkcionalitu jakéhokoliv řešení, pokud si to neosahám). Stejnou abnormalitou je, dle mého laického názoru, že pokud do filtru zadám:
zmenaSouboru.NotifyFilter = IO.NotifyFilters.LastWrite
, což by dle mého byla i logická volba, pak dostanu stejný výsledek, jako když jsem původně filtr neměl vůbec nastavený, tedy zdvojené vyvolání události, přestože si myslím, že pokud soubor uložím, zapíše se pouze jedenkrát??? Pro svůj problém to již sice nepotřebuji, ale nevíte někdo, jak teda tato třída (FileSystemWatcher) vůbec funguje?
|