Laden...

Outlook Ordner Rekursion Problem

Erstellt von Jonathan Hard vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.149 Views
J
Jonathan Hard Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren
Outlook Ordner Rekursion Problem

Hallo zusammen,
ich sitze jetzt seit zwei Tagen vor einem Problem dem ich nicht beikomme.
Weder Kollegen noch Google konnte mir bisher helfen. Also jetzt eskaliere ich das Thema mal nach hier an die Experten.

Ich möchte alle Ordner eines Postfachs (in dem Fall eine in Outlook eingebundene PST Datei) rekursiv durchlaufen und zunächst alle enthaltenen Mails zählen. Diese PST Datei ist mit ca. 3,2 GB relativ groß und die Ordnerverschachtelung dementsprechend.

Dazu habe ich folgende Funktion erstellt:

        
        /// <summary>
        /// Count all Messages in the source store.
        /// </summary>
        public void CountAllMessages(RDOFolder sourceFolder)
        {
            try
            {
                if (sourceFolder.Name.Equals("Logo"))
                    iTest1 = 0;
                foreach (RDOFolder f1 in sourceFolder.Folders)
                {
                    messageCount += f1.Items.Count;
                    if (f1.Folders.Count > 0)
                        CountAllMessages(f1);
                }
            }
            catch (Exception ex)
            {
                if (!testing)
                {
                    mail mail = new mail(@"CountAllMessages", ex.Message);
                    mail.send();
                }
            }
        }

Mein Problem ist nun das nicht alle Ordner durchlaufen werden. In kleinen Tests klappt dies zwar nur eben mit sehr großen Postfächern nicht.
Ich vermutete dies schon anhand der ermittelten Gesamtsumme.
Wenn ich nachweißlich einen Ordner mit dem Namen „Logo“ habe würde ich erwarten das iTest1 = 0; angesprungen wird. Das ist aber nie der Fall.
Kann mir da jemand helfen, dies zu verstehen?

Ich nutze übrigens die RDO objects (http://www.dimastr.com/redemption/rdo_introduction.htm)
Auch mit dem Microsoft.Office.Interop.Outlook namespace gibt es das gleiche Problem.

Danke

1.696 Beiträge seit 2006
vor 9 Jahren

Bei Rekursion besteht immer die Gefahr des Überlaufens des Stappelspeichers. Kannst du mal was sinnvolles in catch reinpacken und guckst, ob Exception geworfen wird. Denn so wie es ist, bekommst du gar keine Exception mit (wenn testing = true).

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

16.806 Beiträge seit 2008
vor 9 Jahren

a) beachte die Groß und Kleinschreibung
b) muss der Name nicht unbedingt Logo sein. Es gibt in Office für Objekte oft interne Namen und Anzeigenamen.
Verwende halt mal den Debugger.

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Und zum Thema Stapelüberlauf: glaube ich jetzt nicht aber alternativ gibts immer noch den Stack<>

J
Jonathan Hard Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren

Hi,

eine Exception wird nie geworfen.
Groß und Kleinschreibung sollte Ok sein.
Die Namen aller Ordner beim Durchlauf sind exakt wie in Outlook dargestellt. Es gibt keinen Grund zu Annahme das dies bei dem Beispiel Ordner anders ist.
Den Debugger habe ich selbstverständlich schon ausführlich benutzt. Aufgrund der großen Anzahl aber schwierig.

Sollte nicht auch eine Exception geworfen werden wenn der Stappelspeicher voll ist?
Wobei die Menge wohl so groß nun auch wieder nicht ist das dies zum Problem wird oder doch?

5.941 Beiträge seit 2005
vor 9 Jahren

Hallo Jonathan

Benutze beim Debuggen Breakpoint Condition und HitCount, das hilft.
Rechtsklick auf den Breakpoint und dann auswählen, siehe:

Condition ist eine Bedingung, bei der er hält (z.B. test.ID == "haus"), Count ist, nach X mal, breaken.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

Gelöschter Account
vor 9 Jahren

Evtl. hilft dir folgender Link weiter MAPI_TOO_BIG

Es hat einen Grund warum die native Outlook Api von Anfang an keine Enumerator für Folder oder Items anbietet und man sich stattdessen mit altertümlich anmutenen Methoden wie GetNext() und MoveNext() auseinander setzen muss. Die Datenmenge die z.B. von einem Exchange Server abgerufen wenn man alle Items auf einmal haben will ist möglicherweise zuviel für den Desktop Client also einfach viel zu gross woran das Outlook Dev Team vorsorglich gedacht hat(OutOfMemoryException) und die Enumerator daher garnicht erst implementiert hat. Der Enumerator(der hier seitens der Redemption API nachimplementiert wurde) zieht aber natürlich erstmal alles was geht in den lokalen Speicher und steigt dann scheinbar wegen der zu grossen Datenmenge irgendwann aus, daher würde ich dem Hinweis hinter dem Link folgen und die foreach loop vermeiden. Outlook bietet für solche Fälle einen 'händischen' Enumerator mit den dir hoffentlich bekannten Mehthoden 'GetFirst()', 'GetNext()', usw. (Ich habe dazu nochmal ein VB6 Beispiel von MS gefunden:Working with Members of an Items Collection)

Das du keine Exception bekommst begründe ich mutmaßlich damit das die Redemption API den Fehler einfach kassiert hat oder du einen Fehler gemacht hast.
Zusatz: Wenn du definitiv sicher bist das der sourceFolderName "Logo" ist und der Brechpunkt nicht erreicht wird ist es entweder ein Schreibfehler(Gross-und-Kleinschreibung) oder Debugger läuft vielleicht garnicht. Oder aber der "Logo" Ordner ist rekursiv soweit verschaltet das vorher abgebrochen wird.
So oder so:
Da es sich um ein Office Projekt handelt, geht es hier möglicherweise um ein Addin. Die Hürden für einen aktiven Debugger sind hier etwas höher. Ich würde so vorgehen das ich einen Brechpunkt auf die öffnende geschweifte Klammer der Methode setzten würde, um mich danach 'durchzusteppen' Wenn dieser Punkt nie erreicht wird ist der Debugger garnicht aktiv, wenn der Punkt erreicht wird, kann man den Rest mit etwas Grips(Überwachung+StackTrace) auch selbst rausfinden.

J
Jonathan Hard Themenstarter:in
5 Beiträge seit 2014
vor 9 Jahren

Hi zusammen,

danke den Link schaue ich mir an.

Ich habe inzwischen mal nicht den Root Ordner an die Funktion übergeben sondern alle Ordner im Root einzeln dann klappt alles (zumindest auf den ersten Blick).