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里的一些其他文件不能删除,原因处在上面(代码中已标出),因此不能返回上一层目录再进行遍历
但很郁闷,不知道怎样修改为好,請指教?也想知道我的思路这样对否
{
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里的一些其他文件不能删除,原因处在上面(代码中已标出),因此不能返回上一层目录再进行遍历
但很郁闷,不知道怎样修改为好,請指教?也想知道我的思路这样对否
if (FindFirst成功)
{
do {
if (.或..) continue;
if (是目录)
{
递归;
}
else
{
DeleteFile;
}
} while(FindNext成功);
CloseHandle;
}
RemoveDirectory;
{
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已经不存在了,该如何是好???請指教
昨天帮我解决了删除文件夹的问题,非常感谢你,引用你的话 上面說到"如果要用一个函数即可删除文件,又可删除文件夹,可以外面再包一层函数来判断是不是文件,如果是文件则直接删除." 以下是我外面包的一层函数,但它只能找到文件,不能找到文件夹,遇到文件夹时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;
}