数据库存放的是blob类型的,通过文件头可以判断出文件类型,但是发现word和excel文件头都是一样的,另存的时候就不知道到底存成那种?试着用StgOpenStorage、ReadClassStg得到文件的CLSID,但是也不行。搞了半天了也没有结果。

解决方案 »

  1.   

    数据库再加一个字段,存的时候标记是word还是excel,读的时候判读此字段即可。
      

  2.   

    1楼办法可以,当然,如果有兴趣的话,可以研究一下,word和excel的文件结构,看看他们的区别
      

  3.   


    那你就得分析两者的文件结构,你将数据库存储的数据拷贝到UltraEdit,十六进制模式下看看头、尾有没有规律可循,然后判读。
      

  4.   

    要么先存为无后缀名,然后再用excel后台打开,若可以打开即为excel,不可以就是word了~~比较麻烦一点~~
      

  5.   

    可以用ReadProcessMemory读取前几个字节,一般文件的前几个字节决定了它的后缀名,只要找到后缀名对应的数值,进行比较就行
      

  6.   

    在blob有效数据前加4个字节的文件类型标识:
    1 - word
    2 - execl
    ...
    other - 其它或者直接用8个字节记录后缀名。
      

  7.   

    gyk120,
    xmoon1983:  word和excel文件头都是一样的de410 :如果是excel的你保存成 a.doc,用Word打开就是乱码如果是word的你保存成 a.xls,用excel打开就是乱码也就是说可能第一条记录是word的,第二条记录是excel的,就解决不了
      

  8.   


    3楼都给了你方法了,看你还没解决,我补段代码function GetOfficeType(const filename: string): string;
    var
      f: TFileStream;
      magic: Int64;
      x: Cardinal;
      s: string;
    begin
      Result := '';
      try
        f := TFileStream.Create(filename, fmOpenRead);
      except
        Exit;
      end;
      try
        try
          f.Seek(0, soFromBeginning);
          f.Read(magic, SizeOf(magic));
          if magic <> $E11AB1A1E011CFD0 then
            Exit;
          f.Seek(-484, soFromEnd);
          ShowMessage(IntToStr(f.Position));
          f.Read(x, SizeOf(x));
          SetLength(s, x);
          f.Read(s[1], x);
          Result := s;
        except
        end;
      finally
        f.Free;
      end;
    end;
    测试:
    ShowMessage(GetOfficeType('c:\test.doc'));
      

  9.   

    用流打开,判断后面几位哈.
    要不你直接将其从数据库取出来.AsString,然后pos('Microsoft Word Document',str)>0就是Word:)
      

  10.   

    搞定了,谢谢各位,excel的后面和word不一样