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);
                    }
                }
            }
        }
        private void WriteStorage(OpenMcdf.CFStorage cfstorage, string directory, uint depth, ref System.Collections.Generic.List<string> outputfiles)
        {
            SFWorkflow.WFFileType.FileType type = SFWorkflow.WFFileType.GetOleFileType(cfstorage);
            if ((cfstorage.Name != "Root Entry") || ((cfstorage.Name == "Root Entry") && (type == SFWorkflow.WFFileType.FileType.OlePackage || type == SFWorkflow.WFFileType.FileType.OleContents)))
            {
                string filename = string.Empty;
                if (type == SFWorkflow.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 == SFWorkflow.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 == SFWorkflow.WFFileType.FileType.OleWord || type == WFFileType.FileType.OlePublisher)
            {
                try
                {
                    OpenMcdf.CFStorage objectpool = cfstorage.GetStorage(type == SFWorkflow.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, SFWorkflow.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);
                }
            }
        }