Benutzer mit den meisten Antworten
File Zugriff gesperrt

Frage
-
MailAttachment = new System.Net.Mail.Attachment(clsEmailDaten.Anhaenge[intCount].ToString()); smtpMsg.Attachments.Add(MailAttachment);
Hi folgendes Problem ich habe einen Dienst am laufen der Sobal ein File in einem bestimmten Ordner abgelegt wird diese als Email versendet.
Nun müsste ich jedoch auch noch diese Datei verschieben jedoch blockiert mein Dienst immer noch das File.
Hier mal kurz der Code des Dienstes:namespace Senden { class FaxFileWatcher : System.ServiceProcess.ServiceBase { public FaxFileWatcher() { this.ServiceName = "FaxFileWatcher"; this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; } static void Main(string[] args) { System.ServiceProcess.ServiceBase.Run(new FaxFileWatcher()); } protected override void OnStart(string[] args) { new System.Threading.Thread(new System.Threading.ThreadStart(delegate { System.IO.FileSystemWatcher fswWatcher = new System.IO.FileSystemWatcher(@"\\Daten\Fax"); fswWatcher.Created += new System.IO.FileSystemEventHandler(fswWatcher_Created); fswWatcher.EnableRaisingEvents = true; fswWatcher.Filter = "*.pdf"; fswWatcher.IncludeSubdirectories = false; while (true) { fswWatcher.WaitForChanged(System.IO.WatcherChangeTypes.Created); } })).Start(); } static void fswWatcher_Created(object sender, System.IO.FileSystemEventArgs e) { string[] strSendeDaten = e.Name.Split('.'); Decimal dFaxauftrag; if (strSendeDaten.Length == 2) { Ho.Basis.Email.clsEmail cEmail = new Ho.Basis.Email.clsEmail(); Ho.Basis.Email.clsEmailDaten cEmailDaten = new Ho.Basis.Email.clsEmailDaten(); Ho.Db.Fax00.clsFax00 cFax00 = new Ho.Db.Fax00.clsFax00(); int intProgrammNummer = 9457; if (Decimal.TryParse(strSendeDaten[0], out dFaxauftrag)) { //Dateiname ist eine Nummer cFax00.Lese(dFaxauftrag, intProgrammNummer); cEmailDaten.Empfaenger = cFax00.Empfaenger + "@fax"; cEmailDaten.Absender = "eins@test.at"; cEmailDaten.Blindkopie = ""; cEmailDaten.Kopie = ""; cEmailDaten.Text = ""; cEmailDaten.Betreff = e.Name; cEmailDaten.Anhaenge.Add(e.FullPath); if (!cEmail.EmailVerschickenBatch(cEmailDaten, false)) { Ho.Basis.Service.clsService cService = new Ho.Basis.Service.clsService(); cService.Logfile("Fehler beim versenden von Email " + e.FullPath + " an: " + cEmailDaten.Empfaenger, intProgrammNummer); } cEmailDaten = null; cEmail = null; } else { Ho.Basis.Service.clsService cService = new Ho.Basis.Service.clsService(); cService.Logfile("Ungültiges PDF File auf H:\\Daten\\Fax", 9457); } } else { Ho.Basis.Service.clsService cService = new Ho.Basis.Service.clsService(); cService.Logfile("Ungültiges PDF File auf H:\\Daten\\Fax", 9457); } } private void InitializeComponent() { // FaxFileWatcher this.ServiceName = "FaxFileWatcher"; } } }
System.IO.File.Move(@"H:\Daten\Fax\" + item.Text, @"H:\Daten\Fax\Archiv\"+item.Text);
Möchte es ganz normal mit dem Move Befehl verschieben funktioniert aber wie gesagt leider nicht.
Hier noch der Auszug aus dem Email versand
MailAttachment = new System.Net.Mail.Attachment(clsEmailDaten.Anhaenge[intCount].ToString()); smtpMsg.Attachments.Add(MailAttachment);<br/> <strong>Würde ein MailAttachment.dispose() nach versenden der Email reichen um mein Problem zu lösen?</strong><br/><strong> (kann im Moment der Code der Mail klasse nicht ändern)</strong>
Der Emailversand funktioniert ganz normal über nen Smtp Client der auf unseren Notes Server zugreift.
gibt es sonst noch eine Möglichkeit dieses Problem zu umgehen? (eigener Thread für jedes Created Event oder blockiert der FileWatcher die Datei?)mfg und danke
Reinhard
Antworten
-
Hi,
Hi folgendes Problem ich habe einen Dienst am laufen der Sobal ein File in einem bestimmten Ordner abgelegt wird diese als Email versendet.
Created ist das falsche Event. Das wird einmal beim erstellen der Datei ausgelöst. Danach folgen ein oder mehrere Changed Events, da die Datei u.U. in mehreren Blöcken geschrieben wird (schön zu sehen bei einem FTP Transfer). Und diese Events musst Du nehmen.
Vorher lies dich mal bitte hier ein:
http://msdn.microsoft.com/de-de/library/x7t1d0ky.aspx
Da stehen einige wichtige Informationen, bspw. auch, wann zusätzlich OnChanged Ereignisse ausgelöst werden, ...
Im Endeffekt bleibt dir nicht viel anderes als zu versuchen, die Datei exklusiv zu öffnen. Wenn das klappt, ist die Datei normalerweise fertig geschrieben.
Hier findest Du ein Beispiel.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert lolsharp Dienstag, 22. März 2011 07:35
-
Hallo ls.,
Das Created Ereignis ist schon das richtige Ereignis dafür, es gilt aber auch: "Sowie eine Datei in ein überwachtes Verzeichnis kopiert oder übertragen wird, wird das OnCreated-Ereignis und anschließend mindestens ein OnChanged-Ereignis ausgelöst." [Quelle]
Man muss aber eben warten, (was bereits richtig erwähnt wurde) bis die Datei wirklich über "FileShare.None" zu öffnen ist, also quasi geschrieben ist:
[How to: Safely use FileSystemWatcher.Created events - Jan Schreuder on .Net]
http://bloggingabout.net/blogs/jschreuder/archive/2006/07/06/12886.aspx
ciao Frank- Als Antwort markiert lolsharp Dienstag, 22. März 2011 07:36
-
Da ich Testweise nur kleine Datein in den Ordner verschoben habe düfte dieses Problem bei mir nicht aufgetreten sein.
Im echtbetrieb wäre es jedoch durchaus möglich gewesen.Die Lösung für mein direktes Problem war jedoch einfach alle Attachments nach versenden wieder freizugeben.
Durch ein einfaches Attachment.Dispose(); habe ich jetzt sofort nach versenden des Mails wieder zugriff auf die Datei.
Seltsamerweise wird dies sonst erst durchgeführt sobald das Programm beendet wird und nicht schon wenn das entsprechende Element nicht mehr existiert.Mfg Reinhard
- Als Antwort markiert lolsharp Dienstag, 22. März 2011 07:36
Alle Antworten
-
Hi,
Hi folgendes Problem ich habe einen Dienst am laufen der Sobal ein File in einem bestimmten Ordner abgelegt wird diese als Email versendet.
Created ist das falsche Event. Das wird einmal beim erstellen der Datei ausgelöst. Danach folgen ein oder mehrere Changed Events, da die Datei u.U. in mehreren Blöcken geschrieben wird (schön zu sehen bei einem FTP Transfer). Und diese Events musst Du nehmen.
Vorher lies dich mal bitte hier ein:
http://msdn.microsoft.com/de-de/library/x7t1d0ky.aspx
Da stehen einige wichtige Informationen, bspw. auch, wann zusätzlich OnChanged Ereignisse ausgelöst werden, ...
Im Endeffekt bleibt dir nicht viel anderes als zu versuchen, die Datei exklusiv zu öffnen. Wenn das klappt, ist die Datei normalerweise fertig geschrieben.
Hier findest Du ein Beispiel.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert lolsharp Dienstag, 22. März 2011 07:35
-
Vielen Dank
Hab ich das so richtig verstanden das zum Zeitpunkt der Created Events die Datei noch nicht fertig ist und deshalb der Zugriff darauf nie beendet wird?
Wenn der gesamte Vorgang auf eine fertig vorhandene Datei durchgeführt wird würde ich also nach Ablauf meines Dienstes wieder Zugriff auf das File haben?mfg Reinhard
-
Hi,
Hab ich das so richtig verstanden das zum Zeitpunkt der Created Events die Datei noch nicht fertig ist und deshalb der Zugriff darauf nie beendet wird?
1. Ja
2. Nein. Was auch immer "der Zugriff darauf beendet" sein soll :)
Wenn der gesamte Vorgang auf eine fertig vorhandene Datei durchgeführt wird würde ich also nach Ablauf meines Dienstes wieder Zugriff auf das File haben?
Das hat mit Ablauf deines Diensts nix zu tun. Ich gehe mal davon aus, dass das Attachment kurzzeitig gesperrt wird, daher die Datei nicht weiter geschrieben werden kann und irgendeines der involvierten Objekte dann einen Fehler erhält (alternativ kann auch ein Deadlock entstehen, a wartet auf b, b wartet auf a)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo ls.,
Das Created Ereignis ist schon das richtige Ereignis dafür, es gilt aber auch: "Sowie eine Datei in ein überwachtes Verzeichnis kopiert oder übertragen wird, wird das OnCreated-Ereignis und anschließend mindestens ein OnChanged-Ereignis ausgelöst." [Quelle]
Man muss aber eben warten, (was bereits richtig erwähnt wurde) bis die Datei wirklich über "FileShare.None" zu öffnen ist, also quasi geschrieben ist:
[How to: Safely use FileSystemWatcher.Created events - Jan Schreuder on .Net]
http://bloggingabout.net/blogs/jschreuder/archive/2006/07/06/12886.aspx
ciao Frank- Als Antwort markiert lolsharp Dienstag, 22. März 2011 07:36
-
Da ich Testweise nur kleine Datein in den Ordner verschoben habe düfte dieses Problem bei mir nicht aufgetreten sein.
Im echtbetrieb wäre es jedoch durchaus möglich gewesen.Die Lösung für mein direktes Problem war jedoch einfach alle Attachments nach versenden wieder freizugeben.
Durch ein einfaches Attachment.Dispose(); habe ich jetzt sofort nach versenden des Mails wieder zugriff auf die Datei.
Seltsamerweise wird dies sonst erst durchgeführt sobald das Programm beendet wird und nicht schon wenn das entsprechende Element nicht mehr existiert.Mfg Reinhard
- Als Antwort markiert lolsharp Dienstag, 22. März 2011 07:36
-
Hallo Reinhard,
schön, dass Du Dein Problem lösen konntest.
... Ja, die Attachment-Klasse implementiert ja die IDisposable-Schnittstelle.
Wenn Klassen IDisposable implementieren (wie eben Attachment), sollte man im allgemeinen entweder am Ende (bei gewünschter Freigabe) Dispose aufrufen, oder zum Teil noch besser: mit der using-Anweisung arbeiten.Es gilt allgemein - Zitat: "Über diese Schnittstelle werden hauptsächlich nicht verwaltete Ressourcen freigegeben. Der Garbage Collector gibt automatisch den für ein verwaltetes Objekt belegten Speicher frei, wenn dieses Objekt nicht mehr verwendet wird. Es kann allerdings nicht vorausgesagt werden, wann die Garbage Collection stattfindet.Darüber hinaus hat der Garbage Collector keine Kenntnis von nicht verwalteten Ressourcen wie Fensterhandles oder offenen Dateien und Streams. Mit der Dispose-Methode dieser Schnittstelle können nicht verwaltete Ressourcen in Verbindung mit dem Garbage Collector explizit freigegeben werden. Der Consumer eines Objekts kann diese Methode aufrufen, wenn das Objekt nicht mehr benötigt wird."
ciao Frank