private void Write(OpenMcdf.CFStorage tostorage, OpenMcdf.CFStorage fromstorage)
 {
     foreach (OpenMcdf.CFItem childitem in fromstorage.EnumChildren)
     {
         if (childitem is OpenMcdf.CFStream)
         {
             OpenMcdf.CFStream olechildstream = tostorage.AddStream(childitem.Name);
             olechildstream.SetData(((OpenMcdf.CFStream)childitem).GetData());
         }
         else if (childitem is OpenMcdf.CFStorage)
         {
             OpenMcdf.CFStorage olechildstorage = tostorage.AddStorage(childitem.Name);
             Write(olechildstorage, (OpenMcdf.CFStorage)childitem);
         }
     }
 }
        private void WriteStorage(OpenMcdf.CFStorage cfstorage, string directory, uint depth, ref System.Collections.Generic.List <string> outputfiles)
        {
            KRSrcWorkflow.WFFileType.FileType type = KRSrcWorkflow.WFFileType.GetOleFileType(cfstorage);
            if ((cfstorage.Name != "Root Entry") || ((cfstorage.Name == "Root Entry") && (type == KRSrcWorkflow.WFFileType.FileType.OlePackage || type == KRSrcWorkflow.WFFileType.FileType.OleContents)))
            {
                string filename = string.Empty;
                if (type == KRSrcWorkflow.WFFileType.FileType.OlePackage)
                {
                    Ole10Native olenative = new Ole10Native(new System.IO.MemoryStream(cfstorage.GetStream(Convert.ToChar((byte)1).ToString() + "Ole10Native").GetData()));
                    filename = olenative.FileName;
                    int idx = olenative.FileName.LastIndexOf("\\");
                    if (idx != -1)
                    {
                        filename = olenative.FileName.Substring(idx + 1);
                    }
                    filename = String.Format("{0}\\{1}", directory, filename);
                    using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write))
                    {
                        fs.Write(olenative.NativeData, 0, olenative.NativeData.Length);
                    }
                }
                else if (type == KRSrcWorkflow.WFFileType.FileType.OleContents)
                {
                    filename = String.Format("{0}\\{1}", directory, "contents");
                    using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write))
                    {
                        byte [] data = cfstorage.GetStream("CONTENTS").GetData();
                        fs.Write(data, 0, data.Length);
                    }
                }
                else
                {
                    OpenMcdf.CompoundFile tmp = new OpenMcdf.CompoundFile();
                    Write(tmp.RootStorage, cfstorage);
                    filename = String.Format("{0}\\{1}", directory, cfstorage.Name);
                    tmp.Save(filename);
                    tmp.Close();
                }
                outputfiles.Add(filename);
            }

            if (depth == 0)
            {
                return;
            }
            depth--;

            if (type == KRSrcWorkflow.WFFileType.FileType.OleWord || type == WFFileType.FileType.OlePublisher)
            {
                try
                {
                    OpenMcdf.CFStorage objectpool = cfstorage.GetStorage(type == KRSrcWorkflow.WFFileType.FileType.OleWord ? "ObjectPool" : "Objects");
                    if (objectpool != null)
                    {
                        cfstorage = objectpool;
                    }
                }
                catch (Exception)
                {
                }
            }

            if (cfstorage != null)
            {
                foreach (OpenMcdf.CFItem item in cfstorage.EnumChildren.Where(x => x.IsStorage))
                {
                    string filedir = string.Format("{0}\\{1}", directory, KRSrcWorkflow.WFUtilities.GetNextDirectoryNumber(directory));
                    if (!System.IO.Directory.Exists(filedir))
                    {
                        System.IO.Directory.CreateDirectory(filedir);
                    }
                    if (System.IO.Directory.Exists(filedir))
                    {
                        WriteStorage((OpenMcdf.CFStorage)item, filedir, depth, ref outputfiles);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        public static FileType GetOleFileType(OpenMcdf.CFStorage cfstorage)
        {
            switch (cfstorage.CLSID.ToString())
            {
            case "000C1084-0000-0000-C000-000000000046":
                return(FileType.OleMsi);

            case "000C1086-0000-0000-C000-000000000046":
                return(FileType.OleMsp);

            case "000C1082-0000-0000-C000-000000000046":
                return(FileType.OleMst);

            case "00020810-0000-0000-c000-000000000046":
                return(FileType.OleExcel);

            case "64818d10-4f9b-11cf-86ea-00aa00b929e8":
                return(FileType.OlePowerPoint);

            case "00020906-0000-0000-c000-000000000046":
                return(FileType.OleWord);

            case "00021a14-0000-0000-c000-000000000046":
                return(FileType.OleVisio);

            case "74b78f3a-c8c8-11d1-be11-00c04fb6faf1":
                return(FileType.OleProject);

            case "00021201-0000-0000-00c0-000000000046":
                return(FileType.OlePublisher);

            case "00020d0b-0000-0000-c000-000000000046":
                return(FileType.OleMsg);
            }

            foreach (OpenMcdf.CFItem item in cfstorage.EnumChildren.Where(x => x.IsStream))
            {
                if (item.Name == Convert.ToChar((byte)1).ToString(CultureInfo.InvariantCulture) + "Ole10Native")
                {
                    return(FileType.OlePackage);
                }
                if (item.Name == "CONTENTS")
                {
                    return(FileType.OleContents);
                }
                if (item.Name == "WordDocument")
                {
                    return(FileType.OleWord);
                }
                else if (item.Name == "Workbook")
                {
                    return(FileType.OleExcel);
                }
                else if (item.Name == "VisioDocument")
                {
                    return(FileType.OleVisio);
                }
                else if (item.Name == "PowerPoint Document")
                {
                    return(FileType.OlePowerPoint);
                }
            }

            return(FileType.Ole);
        }