Forums Neueste Beiträge
 

FileSystemWatcher

22/01/2009 - 18:15 von Brian Schmalisch | Report spam
Hallo,

ich habe eine Anwendung mit einem Labelelement, welches immer dann den Text
àndern soll, wenn eine XML-Datei in dem Anwendungsverzeichnis geàndert wird.
Dazu habe ich herausgefunden, dass dafür FileSystemWatcher benutzt werden
kann.

Wie kann ich damit meine Anwendung laufen lassen und parallel dazu mein
Labeltext àndern, sobald sich die xml-Datei àndert?

Mein Ansatz war wie folgt:
Ich habe eine Komponente erstellt, abgeleitet von Label:
namespace DynText
{
public partial class DynText : Label
{
FileSystemWatcher watcher = new FileSystemWatcher();
}

private string filename = string.Empty;
public string Filename
{
get { return filename; }
set { filename = value; }
}

private string variablename = string.Empty;
public string Variablename
{
get { return variablename; }
set { variablename = value; }
}

private string poolfolder = string.Empty;
public string Poolfolder
{
get { return poolfolder; }
set { poolfolder = value; }
}


public DynText()
{
InitializeComponent();
}

private int LeseXML()
{
XmlDocument doc = new XmlDocument();
try
{
doc.Load(Path.Combine(poolfolder, "dynamic.var"));

XmlNode root = doc.DocumentElement;

XmlNode node = null;

node = root.SelectSingleNode("//variable[@name=\"" +
variablename.Trim() + "\"]");

if (node != null)
{
filename = node.Attributes["text"].Value.Trim();
return 0;
}
}
catch
{ }

return 1;
}

public void Watcher_Changed(object sender, FileSystemEventArgs e)
{
int res = 1;
res = LeseXML();
if (res == 0)
Anzeigen();
}

public void Start()
{
this.AutoSize = false;

watcher.Path = poolfolder;
watcher.Filter = ".var";
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.Size;
watcher.Changed += new FileSystemEventHandler(Watcher_Changed);
watcher.EnableRaisingEvents = true;

if (File.Exists(Path.Combine(poolfolder, "datei.var")))
{
int i = LeseXML();
}

Anzeigen();
}

public void Anzeigen()
{
this.Text = filename;
}
}
}

Mein Formular:
public Form1()
{
InitializeComponent();

dynText1.Left = 10;
dynText1.Top = 10;
dynText1.Width = 200;
dynText1.Height = 32;

dynText1.Filename = "Hallo, Text";
dynText1.Variablename = "var1";
dynText1.Poolfolder = Application.StartupPath;
dynText1.Start();
}
 

Lesen sie die antworten

#1 Frank Dzaebel
22/01/2009 - 19:49 | Warnen spam
Hallo Brian,

Mein Ansatz war wie folgt: [...]



ja, vom Konzept her so möglich.


doc.Load(Path.Combine(poolfolder, "dynamic.var"));



mache lieber über eine Konstante oder eine Eigenschaft.
Man kann sich leicht verschreiben ;-)
und man kann der Variablen dann z.B. ein
hübsches Summary-Tag mitgeben.



watcher.Filter = ".var";



Nimm "*.var" !



if (File.Exists(Path.Combine(poolfolder, "datei.var")))



siehst Du, hier würdest Du dann auch die Variable/Eigenschaft
benutzen, "datei.var" != "dynamic.var". Ausserdem
Dateien auch entsprechend ihres Inhalts als Extension
benennen, also etwa "variablen.xml".


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen