Autor Beitrag
Orothred
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86


C# (VS 2005)
BeitragVerfasst: Do 13.09.07 14: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:

ausblenden volle Höhe C#-Quelltext
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:\\";  

 
      // Konstruktor  
      public Worker(string path)  
      {  
         if (path != "")  
            this.path = path;  
      }  

 
      // Startmethode des Threads  
      public void StartWorker()  
      {  
         FileSystemWatcher fsw = new FileSystemWatcher(this.path);  

 
         // Überwachen aller Unterverzeichnisse einschließen  
         fsw.IncludeSubdirectories = true;  

 
         // Eventauslösung aktivieren  
         fsw.EnableRaisingEvents = true;  

 
         // Ereignishandler  
         fsw.Changed += new FileSystemEventHandler(ChangeFile);  
         fsw.Deleted += new FileSystemEventHandler(DeleteFile);  
         fsw.Created += new FileSystemEventHandler(CreateFile);  
         fsw.Renamed += new RenamedEventHandler(RenameFile);  

 
         try  
         {  
            // in dieser Schleife wird auf etwaige Änderungen im   
            // Dateisystem gewartet  
            while (true)  
            {  
               fsw.WaitForChanged(WatcherChangeTypes.All);  
            }  
         }  
         catch  
         {  
         }  

 
         // Eventauslösung deaktivieren  
         fsw.EnableRaisingEvents = false;  
      }  

 
      // Datei wurde umbenannt  
      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);  
      }  

 
      // Datei wurde neu erzeugt  
      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);  
      }  

 
      // Datei wurde gelöscht  
      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);  
      }  

 
      // Datei wurde geändert  
      private void ChangeFile(object sender, FileSystemEventArgs e)  
      {  
         // wenn es sich bei der geänderten Datei um die Protokolldatei  
         // des Dienstes handelt, die Methode abbrechen  
         string pathChanged = e.FullPath.ToLower();  
         string pathProtocol = protocolFile.ToLower();  

 
         // Änderungen in der Protokolldatei nicht aufzeichnen  
         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)  
         {  
            // maximal 999 Einträge lesen  
            if (count == 999)  
               break;  
            strCol.Add(line);  
            count++;  
         }  

 
         sr.Close();  
         return strCol;  
      }  

 
      // Schreibt eine Änderung in die Protokolldatei  
      private void WriteToLogFile(string entry)  
      {  
         StringCollection changedEntriesCol;  
         if (File.Exists(this.protocolFile))  
            changedEntriesCol = ReadFromLogFile();  
         else  
            changedEntriesCol = new StringCollection();  

 
         // neuen Eintrag an erster Stelle einfügen  
         changedEntriesCol.Insert(0, entry);  

 
         // Schreibt Einträge in eine Log-Datei, dabei neue Datei  
         // erzeugen oder alte überschreiben  
         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 user profile iconChristian S.: Code- durch C#-Tags ersetzt
arj
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: Do 13.09.07 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 13.09.07 19:48 
user profile iconarj 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 ;) .



user profile iconarj 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
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
BeitragVerfasst: Do 13.09.07 23:59 
user profile iconKhabarakh hat folgendes geschrieben:
user profile iconarj 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...

user profile iconKhabarakh hat folgendes geschrieben:
user profile iconarj 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.
Der Parameter der beim Starten übergeben wird hat auch ja nichts mit dem Logfile zu tun! ^^
Das das Problem beim schreiben liegt ist also noch nicht sicher, allenfalls sehr wahrscheinlich.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 14.09.07 12:26 
user profile iconarj hat folgendes geschrieben:
user profile iconKhabarakh hat folgendes geschrieben:
user profile iconarj 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.


user profile iconKhabarakh 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 :zwinker: .
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 :gruebel: .