數據恢復軟件(二):用C++重寫恢復BMP位圖文件的小程序

我用C++的面向對象的設計方法重新編寫了上個恢復BMP的位圖程序.這個看起來有點軟件框架的味道了吧,但代碼多了不少.寫這個小程序還無法體現C++語言的優勢來吧.

#include "windows.h"
#include "stdio.h"
class Raw
{
private:
    HANDLE f;
    DWORD Num;
    DWORD filesize;
public:
    DWORD open(LPCTSTR lp)
    {
        f=::CreateFile(lp,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if(f==INVALID_HANDLE_VALUE){return 0;}
        filesize=::GetFileSize(f,NULL);
        return filesize;
    }
    void read(int i,LPVOID lp,DWORD nNumberOfBytesToRead)
    {
        ::SetFilePointer(f,i,NULL,FILE_BEGIN);
        ::ReadFile(f,lp,nNumberOfBytesToRead,&Num,NULL);
    }
    virtual int comraw(int i)=0;
    void recover(int i,int fsize)
    {
        HANDLE fout;
        char fname[20];
        ::SetFilePointer(f,i,NULL,FILE_BEGIN);
        char *dout=new char[fsize];
        ::ReadFile(f,dout,fsize,&Num,NULL);
        sprintf(fname,"%d.bmp",i);
        fout=::CreateFile(fname,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        ::WriteFile(fout,dout,fsize,&Num,NULL);
        delete [] dout;
        CloseHandle(fout);
    }
    virtual ~Raw()
    {
        CloseHandle(f);
    }
};
class BmpRaw :public Raw
{
private:
    struct BMPHEADER{
        WORD ND;
        WORD TYPE;
        int size;
        WORD r1;
        WORD r2;
    }bh;
public:
    virtual int comraw(int i)
    {
        read(i,&(bh.TYPE),10) ;
        if(bh.TYPE==MAKEWORD('B','M')&&bh.r1==0&&bh.r2==0)
        {
            return bh.size;
        }
        else
        {
            return 0;
        }
    }
};
int main()
{
    DWORD filesize;
    int fsize;
    Raw *r;
    BmpRaw br;
    r=&br;
    filesize=r->open(("img"));
    if (filesize==0)
    {
        return 0;
    }
    for (int i=0;i<(int)filesize;i+=512)
    {
        if((fsize=r->comraw(i))!=0)
        {
            r->recover(i,fsize);
            i=(fsize/512)*512;
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章