Autor Beitrag
acdc
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 15.12.10 15:27 
Hallo,
Ich habe ein kleines Programm, mit dem ich den öffenlichen Kalender in eine Textdatei schreiben kann. Nun besteht jedoch die Möglichkeit auch Attatchments zu einem Eintrag im Kalender hinzuzufügen und diese wird dann nicht kopiert. Ich möchte aber den Anhang mit herauskopieren.

Hier ein Teil des Codes:

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:
      object oNameSpace = oApp.GetType().InvokeMember("GetNamespace", BindingFlags.InvokeMethod, null, oApp, new object[1] { "MAPI" });

      for (int i = 0; i < 30; i++) //Druchsucht die Ordnerstruktur in Outlook
      {

        try
        {
          object objDefaultFolder = oNameSpace.GetType().InvokeMember("GetDefaultFolder", BindingFlags.InvokeMethod, null, oNameSpace, new object[] { i });
          object objFolderItems = objDefaultFolder.GetType().InvokeMember("Folders", BindingFlags.InvokeMethod, null, objDefaultFolder, null);

          int numofentries = (int)objFolderItems.GetType().InvokeMember("Count", BindingFlags.InvokeMethod, null, objFolderItems, null);

          try
          {
            string parentFoldername = (String)objDefaultFolder.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, objDefaultFolder, null);
            if (parentFoldername.Contains("Alle Öffentlichen"))
            {
              System.Collections.IEnumerable items = (System.Collections.IEnumerable)objFolderItems;
              foreach (object cItem in items)
              {
                string foldername = (String)cItem.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, cItem, null);
                if (foldername.Contains("Termine Schule"))
                {
                  string folderpath = (String)cItem.GetType().InvokeMember("FolderPath", BindingFlags.GetProperty, null, cItem, null);  //Outlookpfad des Ordners
                  try
                  {
                    itemsToFile(cItem) //Einzelne Element in Datei speichern
                    break;
                  }
                  catch (Exception ex)
                  {
                    errorcode = 0;
                    
                  }
                }                
              }
            }

          }
          catch
          {
          }

        }
        catch (Exception ex)
        {

        }
      }
    
    //summery ist nur eine ausgabe am Bildschirm zum Debuggen!
    public int itemsToFile(Object curObj)
    {
        FileHandling file = new FileHandling();
        file.WriteFile(dateiPfad, "BillingInformation;Body;CreationTime;Duration;Location;Subject;Start;End\n");
        StringBuilder outString = new StringBuilder();


        object objCalendarItems = curObj.GetType().InvokeMember("Items", BindingFlags.InvokeMethod, null, curObj, null);

        int numofItems = (int)objCalendarItems.GetType().InvokeMember("Count", BindingFlags.InvokeMethod, null, objCalendarItems, null);
        System.Collections.IEnumerable items = (System.Collections.IEnumerable)objCalendarItems;
        foreach (object cItem in items)
        {
            outString.Append((string)cItem.GetType().InvokeMember("BillingInformation", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append((string)cItem.GetType().InvokeMember("Body", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append(((DateTime)cItem.GetType().InvokeMember("CreationTime", BindingFlags.GetProperty, null, cItem, null)).ToString() + ";");
            outString.Append(((int)cItem.GetType().InvokeMember("Duration", BindingFlags.GetProperty, null, cItem, null)).ToString() + ";");
            outString.Append((string)cItem.GetType().InvokeMember("Location", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append((string)cItem.GetType().InvokeMember("Subject", BindingFlags.GetProperty, null, cItem, null) + ";");
            outString.Append(((DateTime)cItem.GetType().InvokeMember("Start", BindingFlags.GetProperty, null, cItem, null)).ToShortDateString() + " " +
              ((DateTime)cItem.GetType().InvokeMember("Start", BindingFlags.GetProperty, null, cItem, null)).ToShortTimeString() + ";");
            outString.Append(((DateTime)cItem.GetType().InvokeMember("End", BindingFlags.GetProperty, null, cItem, null)).ToShortDateString() + " " +
              ((DateTime)cItem.GetType().InvokeMember("Start", BindingFlags.GetProperty, null, cItem, null)).ToShortTimeString() + "\n");
            
            object attatchments=cItem.GetType().InvokeMember("Attachments", BindingFlags.GetProperty, null, cItem, null);


            int attatchmentcount = (int)attatchments.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, attatchments, null);
            if (attatchmentcount > 0)
            {
              summery.Append((string)cItem.GetType().InvokeMember("Subject", BindingFlags.GetProperty, null, cItem, null) + "\n");
                //object item==cItem.GetType().InvokeMember("Attachments", BindingFlags.GetProperty, null, cItem, null);
              //attatchments.GetType().InvokeMember("WriteToFile", BindingFlags.InvokeMethod, null, attatchments, new object[1] { "test.txt" });
              //summery.Append((string)attatchments.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, attatchments, null));

              object item = attatchments.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, attatchments, new object[1] {0});
              
        item.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, item, null);


hier kommt der Fehler: "Ein Aufrufziel hat einen Ausnahmefehler verursacht"
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
        
        
        //summery.Append((string)item.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, item, null));

             

            }
        }

        file.Append(dateiPfad, outString.ToString());
        return numofItems;
    }


Wie schaffe ich es nun mittels Late Binding diese Datei unter einem beliebeigen Pfad zu speichern?

Danke
acdc
acdc Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 16.12.10 09:10 
oder hat jemand eine andre (bessere) Idee wie ich den öffentlichen Kalender inclusieve Attatchments in eine Datei speichere? Mit Hilfe von Google finde ich leider nicht das Richitge.

Danke für die Vorschläge
acdc
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 16.12.10 21:57 
Hallo,

habe mal ein bisschen mit den Interop-Klassen von Outlook rumgespielt. Und das könnte dann so in etwa aussehen:
ausblenden C#-Quelltext
1:
using Outlook = Microsoft.Office.Interop.Outlook;					

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Outlook.Application olApp = new Outlook.ApplicationClass();
Outlook.NameSpace olNS = olApp.GetNamespace("MAPI");
Outlook.MAPIFolder oFolder = olNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items oCalendarItems = oFolder.Items;
foreach (Outlook.AppointmentItem oCalendarItem in oCalendarItems)
{
  Outlook.Attachments oAttachments = oCalendarItem.Attachments;
  foreach (Outlook.Attachment oAttachment in oAttachments)
  {
    oAttachment.SaveAsFile(Path.Combine("c:\\temp\\test", oAttachment.FileName));
  }
}
Der Code ist getestet und funktioniert für einen privaten Kalender. Wie es sich mit öffentlichen Ordnern, speziell öffentlichen Kalendern verhält, konnte ich leider nicht testen. Abder da müsstest Du warscheinlich den Code so verändern:
ausblenden C#-Quelltext
1:
2:
Outlook.MAPIFolder oPublicFolders = olNS.GetDefaultFolder(Outlook.OlDefaultFolders.olPublicFoldersAllPublicFolders);
Outlook.Folders oFolders = oPublicFolders.Folders;


LG, Marko
Ich1986
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 11.01.12 13:08 
Hallo,

Ich bin neu im Forum und hoffe ich darf das Thema nochmal aufgreifen?!

Ich versuche meine freigegebenen Kalender auszulesen und habe schon die Codeänderungen,
welche du vorgeschlagen hast, vorgenommen.

Leider bekomme ich einen Fehler, der wie folgt lautet:

Der Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden.

Aber ich habe einen freigegebenen Kalender