我做了个文件压缩程序,现要将该文件解压后打开.
我已经成功地将该文件写到了MemoryStream中,
问:怎么从内存流中直接打开该文件?不要告诉我:memo1.Lines.LoadFromStream(MS);因为我的文件可能是mp3或exe文件.

解决方案 »

  1.   

    先说一个常识,目前WINDOWS系统是依靠文件扩展名区别文件类型的,
    读到内存流中的数据仅仅是文件内容在WINRAR,WINZIP都是把需要打开的文件解到临时文件中,,过后再删除。。
    题外话,MemoryStream要把文件一下子全部读到内存,倒不如就使用FileStream
      

  2.   

    对于文件类型,大小,原来的文件名等信息我都在流中写入了,完全可以判断,这个不用担心。MemoryStream也好,FileStream也好,关键是怎么从内存流中打开文件?
      

  3.   

    halfdream(哈欠) 你说的很对,我就是想要这种效果,但是不应该是不能实现的吧?
      

  4.   

    看看下面这段代码吧,允许会对你有处。我刚刚写的!
    procedure OpenWord(FileName,aFileName,aFileType,aMemo:string;aDataSet:TDataSet);
    var
      OleWord: TOleContainer;
      BlobStream: TStream;
      Confirmconversions, ReadOnly, AddToRecentFiles: OleVariant;
      PassWordDocument, PasswordTemplate, Revert, WritePasswordDocument: OleVariant;
      WritePasswordTemplate, Format, Encoding, Visible: OleVariant;  begin
        FileName := Trim(aDataSet.FieldByName(aFileName).AsString);
        FileType := LowerCase(Trim(aDataSet.FieldByName(aFileType).AsString));
        FileFullName := TempPath+FileName+FileType;
        //创建BLOB流
        BlobStream := aDataSet.CreateBlobStream(aDataSet.FieldByName(aMemo), bmRead);
        //读取BLOB流
        OleWord := TOleContainer.Create(Application);
        try
          OleWord.Visible := False;
          OleWord.Parent := Application.MainForm;
          OleWord.LoadFromStream(BlobStream);
          //存储到临时文件夹中或打开文件
          if (FileType='.doc')or(FileType='.rtf')or(FileType='.gog') then //只能打开Doc,Rtf,Dot文档
          begin
            OleWord.SaveAsDocument(FileFullName);
            OleWord.Free;        //创建Word和Document
            WordObject := TWordApplication.Create(Application);
            WordDoc := TWordDocument.Create(Application);
            //定制Word中的事件
            WordObject.OnDocumentBeforeSave :=Form1.OnSaveFile;
            WordObject.OnQuit :=Form1.OnQuitWord;
            //设置打开参数
            Confirmconversions := False;
            ReadOnly := False;
            AddToRecentFiles := False;
            PassWordDocument := EmptyParam;
            PasswordTemplate := EmptyParam;
            Revert := False;
            WritePasswordDocument := EmptyParam;
            WritePasswordTemplate := EmptyParam;
            Format := EmptyParam;
            Encoding := EmptyParam;
            Visible := True;
            WordObject.Visible := True;
            WordObject.Caption := '[可加入应用程序标题]'; //可加入应用程序标题        //控制主窗体
            Application.MainForm.Hide;        //打开和连接临时文件夹中的文档
            try
              WordObject.Documents.Open(FileFullName, Confirmconversions, ReadOnly,
                AddToRecentFiles, PassWordDocument, PasswordTemplate, Revert,
                WritePasswordDocument, WritePasswordTemplate, Format, Encoding, Visible);
              WordDoc.ConnectTo(WordObject.ActiveDocument);
            except
              Application.MessageBox(Pchar('打开数据库中的文档错误,请与供应商联系!'),
                '错误', MB_ICONERROR+MB_OK);
              WordDoc.Close;
              WordObject.Quit;
              Application.MainForm.Show;
            end;
          end
          else                     //打开非Doc,Rtf,Dot文档
          begin
            OleWord.DoVerb(ovPrimary);
          end;
        finally
          BlobStream.Free;
        end;
    end;