| 
| 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: 
 			Moderiert von									| 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();
 }
 }
 }
 |   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: |  	  | Und bringt mehr overhead...	  |  Khabarakh hat folgendes geschrieben: |  	  | 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: |  	  | Warum erstellst du die Datei jedes mal neu?!? | 
  . | 
 | 
 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    . |  |  |  |