Autor |
Beitrag |
Orothred
Beiträge: 86
C# (VS 2005)
|
Verfasst: Do 13.09.07 13:44
ich hab einen dienst geschrieben, der veränderungen an dateien im laufwerk c: bemerken soll und in einer .log datei abspeichern soll. die log-datei wird zwar erstellt, aber es wird nichts hineingeschrieben. woran kann das liegen?
das ist der gesamte code des dienstes:
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: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using System.IO; using System.Threading; using System.Collections.Specialized; using System.Reflection;
namespace FileWatchService { public partial class Service1 : ServiceBase { private Thread thread; private string path = "";
public Service1() { InitializeComponent(); }
protected override void OnStart(string[] args) { if (args.Length != 0) this.path = args[0]; Worker worker = new Worker(this.path); thread = new Thread(new ThreadStart(worker.StartWorker)); thread.Start(); this.EventLog.WriteEntry("FileWatchService wurde erfolgreich gestartet"); }
protected override void OnStop() { thread.Abort(); thread = null; this.EventLog.WriteEntry("FileWatchService wurde beendet"); }
protected override void OnPause() { thread.Suspend(); this.EventLog.WriteEntry("FileWatchService wurde angehalten"); }
protected override void OnContinue() { thread.Resume(); this.EventLog.WriteEntry("FileWatchService wurde fortgesetzt"); } }
public class Worker { private string protocolFile = "C:\\Projekte\\FileWatchSystem\\FileWatchLog.log"; private string path = "C:\\";
public Worker(string path) { if (path != "") this.path = path; }
public void StartWorker() { FileSystemWatcher fsw = new FileSystemWatcher(this.path);
fsw.IncludeSubdirectories = true;
fsw.EnableRaisingEvents = true;
fsw.Changed += new FileSystemEventHandler(ChangeFile); fsw.Deleted += new FileSystemEventHandler(DeleteFile); fsw.Created += new FileSystemEventHandler(CreateFile); fsw.Renamed += new RenamedEventHandler(RenameFile);
try { while (true) { fsw.WaitForChanged(WatcherChangeTypes.All); } } catch { }
fsw.EnableRaisingEvents = false; }
private void RenameFile(object sender, RenamedEventArgs e) { string entry = "[" + DateTime.Now.ToShortTimeString() + "] " + String.Format("Pfad: {0}; Datei umbenannt: von {1} nach {2}", Path.GetDirectoryName(e.FullPath), e.OldName, e.Name); WriteToLogFile(entry); }
private void CreateFile(object sender, FileSystemEventArgs e) { string entry = "[" + DateTime.Now.ToShortTimeString() + "] " + String.Format("Pfad: {0}; Datei erstellt{1}", Path.GetDirectoryName(e.FullPath), e.Name); WriteToLogFile(entry); }
private void DeleteFile(object sender, FileSystemEventArgs e) { string entry = "[" + DateTime.Now.ToShortTimeString() + "]" + String.Format("Pfad: {0}; Datei gelöscht: {1}", Path.GetDirectoryName(e.FullPath), e.Name); WriteToLogFile(entry); }
private void ChangeFile(object sender, FileSystemEventArgs e) { string pathChanged = e.FullPath.ToLower(); string pathProtocol = protocolFile.ToLower();
if (pathChanged == pathProtocol) return; string entry = "[" + DateTime.Now.ToShortTimeString() + "] " + String.Format("Pfad: {0}; Datei geändert:{1}", Path.GetDirectoryName(e.FullPath), e.Name); WriteToLogFile(entry); }
private StringCollection ReadFromLogFile() { StringCollection strCol = new StringCollection(); StreamReader sr = new StreamReader(this.protocolFile); string line = ""; int count = 1;
while ((line = sr.ReadLine()) != null) { if (count == 999) break; strCol.Add(line); count++; }
sr.Close(); return strCol; }
private void WriteToLogFile(string entry) { StringCollection changedEntriesCol; if (File.Exists(this.protocolFile)) changedEntriesCol = ReadFromLogFile(); else changedEntriesCol = new StringCollection();
changedEntriesCol.Insert(0, entry);
FileStream fs = new FileStream(this.protocolFile, FileMode.Create); StreamWriter sw = new StreamWriter(fs);
foreach (string str in changedEntriesCol) sw.WriteLine(str); sw.Close(); } } } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
arj
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Do 13.09.07 17:34
Mir sind zwei Sachen aufgefallen:
Warum erstellst du die Datei jedes mal neu?!?
und
Mit was für einem Pfad wird der Service (bzw. dann der Worker) denn aufgerufen?
Setz den Pfad mal fest und achte darauf das dein Logfile nicht im Pfad ist
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 13.09.07 18:48
arj hat folgendes geschrieben: | Warum erstellst du die Datei jedes mal neu?!? |
Weil er die neue Zeile an den Anfang hängen will? Könnte man auch durch Stream-Kopiererei lösen, aber so ists halt bequemer .
arj hat folgendes geschrieben: | Mit was für einem Pfad wird der Service (bzw. dann der Worker) denn aufgerufen? |
Die Datei wird doch erstellt, der Fehler liegt also beim Schreiben der Daten.
@Orothred: Schau dir deinen alten Thread noch einmal an, besonders den Teil unter deiner ersten Stellung dieser Frage.......
|
|
arj
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Do 13.09.07 22:59
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 14.09.07 11:26
arj hat folgendes geschrieben: | Khabarakh hat folgendes geschrieben: | arj hat folgendes geschrieben: | Warum erstellst du die Datei jedes mal neu?!? | Weil er die neue Zeile an den Anfang hängen will? Könnte man auch durch Stream-Kopiererei lösen, aber so ists halt bequemer . | Und bringt mehr overhead... |
Bei höchstens 1 MB Daten würde ich mich doch lieber an Herrn Knuth (oder wars nun doch Dijkstra :B ?) halten, vor allem wenn ich Anfänger wäre: Zitat: | Premature optimization is the root of all evil (or at least most of it) in programming. |
Khabarakh hat folgendes geschrieben: | Der Parameter der beim Starten übergeben wird hat auch ja nichts mit dem Logfile zu tun! ^^ |
Wenn die Datei erstellt wurde, muss der Watcher doch wohl mindestens einmal gefeuert (und eigentlich auch irgendeinen String hineingeschrieben) haben. Oder Orothred führt uns aufs Glatteis und die Datei existiert noch aus älteren Versionen .
Allerdings habe ich gerade bemerkt, dass ein Schließen des Writers automatisch zu einem Stream-Flush führt, daran kann es also ebenfalls nicht liegen .
|
|
|