• 启程光盘助手_演示代码



    typedef struct SciFileHeader
    {
        long lType;
        char strBuffer[52];
        long nDiskSize;
        long nFileNum;
        long nFolderNum;
        long nCommentStartAddr;
        long nCommentLen;
        long nCommentEndAddr;
        long nCoverLen;   
    }SciFileHeader;

    typedef struct SciBlockInfo
    {
        long ChildItemAddr;
        long NextItemAddr;
        long filenamelength;
        long filetype;
        long info4;
        long filelength;
        FILETIME filetime;
    }SciBlockInfo;

    typedef struct TreeItem
    {
        TreeItem* lpChildItem;
        TreeItem* lpNextItem;
        long filenamelength;
        long filetype;
        long info4;
        long filelength;
        SYSTEMTIME filetime;
        char strFileName[MAX_PATH];
    }TreeItem;

    void DeleteItem(TreeItem* lpItem);
    TreeItem* NewItem();
    TreeItem* ParseFile(HANDLE hFile);


    void CTestMfcDlg::OnOK()
    {
        DWORD nRead;
        HANDLE hFile = NULL;
        CString m_strFileName;
        HTREEITEM hRoot = NULL;
        TreeItem *lpTemp = NULL;
        SciFileHeader stFileHead;

        m_stEditCtrl.GetWindowText(m_strFileName);

        if (m_strFileName.IsEmpty())
            return;
        if (m_strFileName.GetLength() <= 0)
            return;

        if (GetFileAttributes(m_strFileName) == 0xffffffff)
            return;

        hFile = CreateFile(m_strFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if (INVALID_HANDLE_VALUE == hFile)
            return;

        if (!ReadFile(hFile,&stFileHead,sizeof(SciFileHeader),&nRead,NULL))
            goto Exit;

        if (nRead != sizeof(SciFileHeader))
            goto Exit;

        if (stFileHead.lType != 0x46494353)
            goto Exit;

        //解析文件
        lpTemp = ParseFile(hFile);
        if (lpTemp == NULL)
            goto Exit;
        CloseHandle(hFile);

        m_strFileName.Format("%s | %d | %d | %d",stFileHead.strBuffer,stFileHead.nDiskSize,
                                                 stFileHead.nFolderNum,stFileHead.nFileNum);

        //插入树中
        hRoot = m_stTreeCtrl.InsertItem(m_strFileName);
        if (hRoot == NULL)
        {
            DeleteItem(lpTemp);
            return;
        }

        InsertTreeItem(lpTemp,hRoot);
        DeleteItem(lpTemp);
        return;

    Exit:
        CloseHandle(hFile);
     // TODO: Add extra validation here
    }


    TreeItem* ParseFile(HANDLE hFile)
    {
        DWORD nRead;
        TreeItem* lpTemp;
        char strBuffer[MAX_PATH];
        SciBlockInfo stBlockInfo;

        if (hFile == NULL)
            return NULL;

        lpTemp = NULL;

        ZeroMemory(&stBlockInfo,sizeof(SciBlockInfo));

        //读取数据
        if (!ReadFile(hFile,&stBlockInfo,sizeof(SciBlockInfo),&nRead,NULL))
            return NULL;

        //判断读取是否正确
        if (nRead != sizeof(SciBlockInfo))
            return NULL;

        //校验文件长度是否正确
        if (stBlockInfo.filenamelength >= MAX_PATH)
            return NULL;

        //读取文件名
        if (!ReadFile(hFile,strBuffer,stBlockInfo.filenamelength,&nRead,NULL))
            return NULL;

        //判断读取是否正确
        if (nRead != stBlockInfo.filenamelength)
            return NULL;
       
        strBuffer[stBlockInfo.filenamelength] = '';

        //OK可以赋值了
        lpTemp = NewItem();
        if (lpTemp == NULL)
            return NULL;

        lpTemp->filenamelength = stBlockInfo.filenamelength;
        lpTemp->filetype       = stBlockInfo.filetype;
        lpTemp->info4          = stBlockInfo.info4;
        lpTemp->filelength     = stBlockInfo.filelength;

        CopyMemory(lpTemp->strFileName,strBuffer,MAX_PATH);

        FileTimeToSystemTime(&(stBlockInfo.filetime),&(lpTemp->filetime));

        if (stBlockInfo.ChildItemAddr != -1)
            lpTemp->lpChildItem = ParseFile(hFile);
       
        if (stBlockInfo.NextItemAddr != -1)
            lpTemp->lpNextItem = ParseFile(hFile);

        return lpTemp;
    }

  • 相关阅读:
    event.srcElement就是指向触发事件的元素,他是什么就有什么的属性
    HTML title属性换行显示的方法
    O(∩_∩)O哈哈~
    练习题 英文正常语句倒序书写,标点位置不变
    累了就请休息一下。。。
    给自定义用户控件传递参数
    repeater做成gridview【更新删除编辑等】
    【公众号系列】12306购票送温暖
    【公众号系列】超详细SAP HANA JOB全解析
    【公众号系列】浅谈SAP项目管理的技能
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/3680981.html
Copyright © 2020-2023  润新知