Hallo,
ich entwickle gerade ein kleines Programm, mit dem ich die E-Mails sowie Meetings exportieren kann. Alles Items sollen auf dem Dateisystem gespeichert werden, mit der Ordnerstruktur wie sie in Outlook angelegt sind.
private void ExportItems(MAPIFolder folder)
{
Directory.CreateDirectory(ExportPathField.Text + folder.FullFolderPath);
Items items = folder.Items;
if (items.Count > 0)
{
for (int counter = 1; counter <= items.Count; counter++)
{
object item = items[counter];
switch (Microsoft.VisualBasic.Information.TypeName(item))
{
case "MailItem":
(item as MailItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MailItem).ReceivedTime.ToOADate() + ".msg");
break;
case "MeetingItem":
(item as MeetingItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MeetingItem).ReceivedTime.ToOADate() + ".msg");
break;
default:
break;
}
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(item);
}
}
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(items);
for (int counter = 1; counter <= folder.Folders.Count; counter++)
{
ExportItems(folder.Folders[counter]);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(folder.Folders[counter]);
}
}
Das Programm funktioniert mir kleinen Postfächern super, allerdings gibt es bei größeren eine "System.OutOfMemoryException". Der bis dort hin exportierte Ordner ist dann 999MB groß. Ich habe den Build schon auf 64-Bit umgestellt und in der App.cfg folgendes eingefügt, allerdings ohne Erfolg:
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
Ich hoffe Ihr könnt mir helfen und sagen wo mein Fehler ist.
Viele Grüße
So wie das aussieht funktioniert das nicht.> Fehlermeldung:
System.OutOfMemoryException
HResult=0x8007000E
Nachricht = Es steht nicht genügend Arbeitsspeicher zur Verfügung. Schließen Sie einige Dateien oder Programme, und versuchen Sie es erneut
Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>
Stapelüberwachung:
<Die Ausnahmestapelüberwachung kann nicht ausgewertet werden.>
An welcher Stelle genau in dem Code oben tritt der Fehler auf?
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
Hi,
so wie ich Office kenne - muss man jedes Objekt separat freigeben. Das sieht zwar bei dir eigentlich danach aus als ob - andererseits hatte ich bei direkter Verwendung der PIA's selbst schon ähnliche Probleme - mit NetOffice war das Problem bei mir von alleine behoben...
LG
An dieser Stelle:
(item as MailItem).SaveAs(ExportPathField.Text + folder.FullFolderPath + @"\" + (item as MailItem).ReceivedTime.ToOADate() + ".msg");
Hallo, kann es sein das die Platte voll läuft? Ganz eine einfache Frage 😉
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
Ich meine, dass Taipi hier Recht hat.
Outlook ist zickig und will i.d.R. Dinge einzeln disposed haben.
Sei Dir aber bewusst, dass der Zugriff auf Exchange/Office 365 ohnehin der bessere Weg wäre, als direkt sich an Outlook zu hängen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code