• 需要调用三个函数

    //删除字符串最后的斜杠

    1. void TrimSlash(CString& strTxt);//参数为被删除文件的路径

    //删除文件夹中的文件和文件夹

    2.void DeleteFilesAndFolders(LPCTSTR lpFiles);//参数为被删除文件的路径

    应用举例:

    //////////////////////////////////////

     CString strPath(_T("D:\\sunhm@seepole.net\\"));
     
     TrimSlash(strPath);
     //
     strPath += _T("\\");
     //
     DeleteFilesAndFolders(strPath);

    //////////////////////////////////////////////

    void TrimSlash(CString& strTxt)
    {
     ATLASSERT(!strTxt.IsEmpty());

     int nFind = strTxt.ReverseFind('\\');
     int nLen = strTxt.GetLength();
     if (-1 != nFind && nFind == nLen - 1)   //slash
     {
      strTxt.Delete(nFind);

      //
      TrimSlash(strTxt);
     }else{
      return;
     }

    }

    ///////////////////////////////////////////////////////////////////

    void CLookFileDlg::DeleteFilesAndFolders( LPCTSTR lpFiles )
    {
     WIN32_FIND_DATA FileData;   //
     TCHAR szFileName[MAX_PATH] = {0}; //
     CString strPath(lpFiles);   //path

     //Get file attributes
     DWORD dwAttri = GetFileAttributes(lpFiles);

     //directory
     if (dwAttri == FILE_ATTRIBUTE_DIRECTORY)
     {
      //get child item
      HANDLE hFile = FindFirstFile( strPath + _T("*.*"), &FileData);
      
      CString strFile;
      BOOL   bFind = TRUE;
      while (bFind)
      {

       if(FILE_ATTRIBUTE_DIRECTORY == FileData.dwFileAttributes)
       {
        //all files is deleted
        //delete folder
        BOOL bRemove;
        if (FileData.cFileName[0] != '.')//is not dot
        {
         DeleteFilesAndFolders(strPath + FileData.cFileName + _T("\\"));
         bRemove = RemoveDirectory(strPath+ FileData.cFileName);     
        }    
        
       }else
       {

        ZeroMemory(szFileName,sizeof(TCHAR)* MAX_PATH);
        wcscpy(szFileName, FileData.cFileName);

        strFile.Empty();
        strFile = strPath + szFileName;

        //delete file
        BOOL bDel = DeleteFile(strFile);
       }

       //find next item
       ZeroMemory(&FileData, sizeof(WIN32_FIND_DATA));
       bFind = FindNextFile(hFile, &FileData);
      }
      
      FindClose (hFile);
     }
    }

  • void CMDIFrameWnd::OnWindowNew()
    {
        CMDIChildWnd* pActiveChild = MDIGetActive();
        CDocument* pDocument;
        if (pActiveChild == NULL ||
          (pDocument = pActiveChild->GetActiveDocument()) == NULL)
        {
            TRACE(traceAppMsg, 0, "Warning: No active document for WindowNew command.\n");
            AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
            return;     // command failed
        }

        // otherwise we have a new frame !
        CDocTemplate* pTemplate = pDocument->GetDocTemplate();
        ASSERT_VALID(pTemplate);
        CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
        if (pFrame == NULL)
        {
            TRACE(traceAppMsg, 0, "Warning: failed to create new frame.\n");
            return;     // command failed
        }

        pTemplate->InitialUpdateFrame(pFrame, pDocument);
    }
  • near指针和far指针

    在DOS下(实模式)地址是分段的,每一段的长度为64K字节,刚好是16位(二进制的十六位)。 near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。 far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,(所以实际上far指针是20位的长度。)即可 得到far指针的1M字节的偏移量。所以far指针的寻址范围是1M字节,超过了一个段64K的容量。例如一个far指针的段地址为0x7000,偏移量 为0x1244,则该指针指向地址0x71224.如果一个far指针的段地址是0x7122,偏移量为0x0004,则该指针也指向地址 0x71224。 如果没有指定一个指针是near或far,那么默认是near。所以far指针要显式指定。far指针工作起来要慢一些,因为每次访问一个far指针时, 都要将数据段或程序段的数据交换出来。另外,far指针的运算也比较反常,例如上面讲到的far指针指向同一个地址,但是比较的结果却不相同。

    引用 http://dc412.spaces.live.com/blog/cns!efd51db5d69a8f5d!120.entry 

  • 2007-11-29

    delete this - [C++再学习]

    来源:http://www.cnblogs.com/taoxu0903/archive/2007/05/12/744041.html

    First Step------dive into "delete p"

    delete p 执行了哪两个步骤?
    delete p 是一个两步的过程:调用析构函数,然后释放内存。delete p产生的代码看上去是这样的(假设是Fred*类型的):

    // 原始码:delete p;
    if (p != NULL)
    {
       p->~Fred();
       operator delete(p);
    }

    p->~Fred() 语句调用 p 指向的Fred 对象的析构函数。

    operator delete(p) 语句调用内存释放原语 void operator delete(void* p)。

    Second Step-------"delete this"

    成员函数调用delete this合法吗?
    只要你小心,一个对象请求自杀(delete this),是可以的。

    以下是我对“小心”的定义:

    你必须100%的确定,this对象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一个栈上的局部对象,也不是全局的,也不是另一个对象的成员,而是明白的普通的new)。
    你必须100%的确定,该成员函数是this对象最后调用的的成员函数。
    你必须100%的确定,剩下的成员函数(delete this之后的)不接触到 this对象任何一块(包括调用任何其他成员函数或访问任何数据成员)。
    你必须 100%的确定,在delete this之后不再去访问this指针。换句话说,你不能去检查它,将它和其他指针比较,和 NULL比较,打印它,转换它,对它做任何事。
    自然,对于这种情况还要习惯性地告诫:当你的指针是一个指向基类类型的指针,而没有虚析构函数时(也不可以 delete this)。

    注意:
    因为是在类成员函数里面delete this的,所以在此语句以后,不能访问任何的成员变量及虚函数,否则一定非法。

  • if(finder.IsDirectory()   &&   !finder.IsDots())

    IsDirectory表明这是一个目录,isDots表明这个是.或者..而这两个东西虽然是目录,但是一个表明这个目录本身,一个代表上层目录(但是根目录下面..也是本身)。所以这个表明的意思是finder是一个目录并且不是这个目录本身或者上层目录 。

    IsDirectory判断是否为目录,IsDots判断是否为点--这个要说明一下,你用过Dos的话,就应该知道,每个目录下都有缺省的两个目录,名称分别为'.'和'..',分别代表上一层目录和本层目录。因此,当我们在遍历目录下文件时,需要过滤掉这两个缺省目录。