bool FTP::deleteFtpfile( const CString & fileName )
 {
 CString tempFileName = fileName;
 //判断文件还是文件夹,成立则是文件夹
 if (tempFileName.Find(_T("."),0) == -1)
 {
 tempFileName += _T("\\");
 WIN32_FIND_DATA dirInfo;
 HINTERNET hFile = NULL;
 hFile = FtpFindFirstFile(m_hIntConnect, tempFileName, &dirInfo, INTERNET_FLAG_HYPERLINK, 0 );
 if ( hFile == NULL )
 {
 if( GetLastError( ) == ERROR_NO_MORE_FILES )
 {
 goto delDir;//若文件夹为空,删除文件夹
 }
 }
 do
 {
 CString deleteFileName = tempFileName;
 deleteFileName += dirInfo.cFileName;
 if (wcscmp(dirInfo.cFileName,L".") == 0 || wcscmp(dirInfo.cFileName,L"..") == 0) 
 {
 continue;
 } 
 if (dirInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
 {
 InternetCloseHandle(hFile); //注意,问题出在这,在这里我已经把上一层的文件枚举句柄关掉了,因此下面的循环不能再继续寻找
 deleteFtpfile(deleteFileName);
 }
 else
 {
 FtpDeleteFile(m_hIntConnect,deleteFileName);
 }
 }while(InternetFindNextFile( hFile, (LPVOID) &dirInfo )) ;
delDir: if(!FtpRemoveDirectory(m_hIntConnect,fileName))
{
return false;
}
 }
 //若是文件,直接进行删除
 else
 {
 if(!FtpDeleteFile(m_hIntConnect,fileName))
 {
 return false;
 }
 }
 return true;
 }以上是我的代码,我已找出问题所在,但不知道应怎样修改实现,我举例:在ftp服务端的根目录上有个A文件夹,目录A里面有一些其他文件,也有一个B文件夹,在/A/B/文件夹里还有一些文件,我点击删除A文件夹执行一上代码时,结果只能删除B文件夹里的文件和B文件夹,但A里的一些其他文件不能删除,原因处在上面(代码中已标出),因此不能返回上一层目录再进行遍历
但很郁闷,不知道怎样修改为好,請指教?也想知道我的思路这样对否

解决方案 »

  1.   

    跟你说下大概流程:
    if (FindFirst成功)
    {
        do {
            if (.或..) continue;
            if (是目录)
            {
                递归;
            }
            else
            {
                DeleteFile;
            }
        } while(FindNext成功);
        CloseHandle;
    }
    RemoveDirectory;
      

  2.   

    bool FTP::deleteFtpfile( const CString & fileName )
     {
     CString tempFileName = fileName;
     tempFileName += _T("\\");
     WIN32_FIND_DATA dirInfo;
     HINTERNET hFile = FtpFindFirstFile(m_hIntConnect, tempFileName, &dirInfo, INTERNET_FLAG_HYPERLINK, 0 );
     if ( hFile != NULL )
     {
     do
     {
     if (wcscmp(dirInfo.cFileName,L".") == 0 || wcscmp(dirInfo.cFileName,L"..") == 0) 
     {
     continue;
     } 
     CString deleteFileName = tempFileName;
     deleteFileName += dirInfo.cFileName;
     if (dirInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
     {
     deleteFtpfile(deleteFileName);
     }
     else
     {
     FtpDeleteFile(m_hIntConnect,deleteFileName);
     }
     }while(InternetFindNextFile( hFile, (LPVOID) &dirInfo )) ;
     InternetCloseHandle(hFile);
     }
     FtpRemoveDirectory(m_hIntConnect,fileName);
     return true;
     } 
    我完全按照你的流程也不行啊,主要原因是在我进入递归之前没有InternetCloseHandle(hFile),因此进入下层递归时FtpFindFirstFile不成功,但如果注释掉InternetCloseHandle(hFile),递归完后返回时,上一层目录的hFile已经不存在了,该如何是好???請指教
      

  3.   

    对,忘了这点,你在递归之前先关句柄,返回后重新FtpFindFirstFile就可以了。
      

  4.   

    可以在程序中用GetLastError判断,如果错误码是2,则认为成功。12003不清楚是什么原因,可以试试Sleep一下然后再删,多重复几次。
      

  5.   

    问题终于解决掉,谢谢cnzdgs的帮忙!
      

  6.   


    昨天帮我解决了删除文件夹的问题,非常感谢你,引用你的话 上面說到"如果要用一个函数即可删除文件,又可删除文件夹,可以外面再包一层函数来判断是不是文件,如果是文件则直接删除." 以下是我外面包的一层函数,但它只能找到文件,不能找到文件夹,遇到文件夹时hfile句柄就为Null返回,能帮我看看是什么问题吗?(解答后你回复我另一个帖子,我可再给你散分)以下是我的代码,帮忙帮忙! bool FTP::deleteFtpfile( const CString & fileName )
     {
     WIN32_FIND_DATA fileInfo;
     HINTERNET fileOrFolder = FtpFindFirstFile(m_hIntConnect, fileName, &fileInfo, INTERNET_FLAG_HYPERLINK, 0 );
     if (fileOrFolder == NULL)
     {
     InternetCloseHandle(fileOrFolder);
     return false;
     }
     InternetCloseHandle(fileOrFolder);
     if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
     {
     delDir(fileName);
     }
     else
     {
     delFile(fileName);
     }
     return true;
     }