MFC 对文件以及文件夹操作

/* 功能在文件夹中搜索后缀相同的文件
szFilePath 文件夹路径
strExt 要搜索的文件后缀
*/
BOOL FindIsFiles(CString szFilePath, CString strExt)
{
CFileFind finder;
BOOL bWorking = FALSE;

// bWorking = PathIsRoot(szFilePath);
// if ( PathIsRoot(szFilePath) )///判断是否是盘符
// {
// return FALSE;
// }
// bWorking = PathIsDirectory(szFilePath);
// if (PathIsDirectory(szFilePath))//判断是否是文件路径
// {
// }

if(szFilePath.GetLength())
    bWorking = finder.FindFile(szFilePath + _T("\\*.*"));

while(bWorking)
{
    bWorking = finder.FindNextFile();
    if (finder.IsDots())
    {
        if((finder.GetFileName() == _T("..")) && (bWorking == FALSE))
            break;
        continue;
    }

    if (finder.IsDirectory())
    {
        CString str = finder.GetFilePath();

        CString szFileName = finder.GetFileName();
        CString strFileUp = szFileName, strExtUp = strExt;
        strFileUp.MakeUpper();
        strExtUp.MakeUpper();
        if(strFileUp.Right(strExtUp.GetLength()) == strExtUp)
        {
            return TRUE;
        }
    }
    else
    {
        CString str = finder.GetFilePath();

        CString szFileName = finder.GetFileName();
        CString strFileUp = szFileName, strExtUp = strExt;
        strFileUp.MakeUpper();
        strExtUp.MakeUpper();
        if(strFileUp.Right(strExtUp.GetLength()) == strExtUp)
        {
            return TRUE;
        }
    }
}
return FALSE;

}

/*
重命名所有文件,还没有实现完全
szFilePath:文件路径
szFileName:重命名的文件
*/
BOOL RenameAllFile(CString szFilePath, vector& szFileName)
{
CFileFind finder;
BOOL bWorking = FALSE;

if(szFilePath.GetLength())
    bWorking = finder.FindFile(szFilePath + _T("\\*.*"));

while(bWorking)
{
    bWorking = finder.FindNextFile();
    if (finder.IsDots())
    {
        if((finder.GetFileName() == _T("..")) && (bWorking == FALSE))
            break;
        continue;
    }

    if (finder.IsDirectory())
    {
        CString str = finder.GetFilePath();
        RenameAllFile(str, szFileName);
    }
    else
    {
        szFileName.push_back(finder.GetFileName());
    }
}
return TRUE;

}
/*
功能:从当前文件夹szFilePath 开始查找strExt,如果查找到则把它放入vctFind中
描述:针对车型升级失败,而car.bmp又删除不掉,这个时候必须对car.bmp进行重名,
否则在读取车型时,会显示这张图片,但是点击又不能启动诊断程序。
对于其他文件,就不需要这样处理了,只需要车型文件夹重命名就可以了
参数:
szFilePath : 车型文件夹名称
strExt : car.bmp
vctFind : 存放需要重名的文件
*/
BOOL RenameCarBmp(CString szFilePath, CString strExt, vector& vctFind)
{
CFileFind finder;
BOOL bWorking = FALSE;

if(szFilePath.GetLength())
    bWorking = finder.FindFile(szFilePath + _T("\\*.*"));

while(bWorking)
{
    bWorking = finder.FindNextFile();
    if (finder.IsDots())
    {
        if((finder.GetFileName() == _T("..")) && (bWorking == FALSE))
            break;
        continue;
    }

    if (finder.IsDirectory())
    {
        CString str = finder.GetFilePath();
        RenameCarBmp(str, strExt, vctFind);
    }
    else
    {
        CString szFileName = finder.GetFileName();
        CString strFileUp = szFileName, strExtUp = strExt;
        strFileUp.MakeUpper();
        strExtUp.MakeUpper();
        if(strFileUp.Right(strExtUp.GetLength()) == strExtUp)
        {
            vctFind.push_back(szFilePath+_T("\\")+szFileName);
        }
    }
}
return TRUE;

}

//ReNameFolder
//参数:lpszFromPath 源文件夹路径,lpszToPath 目的文件夹路径
//作用:修改原文件夹的名字
//
BOOL ReNameFiles(CString& lpszFolderPath, CString& lpszFilePrev)
{
CString strFileName = _T(“”);

BOOL bRet;
int idx = 0;

if (GetFileAttributes(lpszFolderPath) == -1)///zp 20161025 说明文件不存在,可以接着升级
{
    m_FilePath.SetFocus();
    AfxMessageBox(_T("文件路径错误!!!请重新指定"));
    return TRUE;
}
if (lpszFilePrev.GetLength() <= 0)///zp 20161025 说明文件不存在,可以接着升级
{
    m_FilePrev.SetFocus();
    AfxMessageBox(_T("请指定文件前缀!!!"));
    return TRUE;
}
vector<CString> vctGuoJia;
vctGuoJia.push_back(_T("CN"));
vctGuoJia.push_back(_T("DE"));
vctGuoJia.push_back(_T("EN"));
vctGuoJia.push_back(_T("ES"));
vctGuoJia.push_back(_T("FR"));
vctGuoJia.push_back(_T("HE"));
vctGuoJia.push_back(_T("HK"));
vctGuoJia.push_back(_T("HU"));
vctGuoJia.push_back(_T("IT"));
vctGuoJia.push_back(_T("JP"));
vctGuoJia.push_back(_T("KR"));
vctGuoJia.push_back(_T("NL"));
vctGuoJia.push_back(_T("PL"));
vctGuoJia.push_back(_T("PT"));
vctGuoJia.push_back(_T("RU"));
vctGuoJia.push_back(_T("SE"));
vctGuoJia.push_back(_T("TH"));

int i = 0;
CString strCarName=_T("CAR.BMP");
while (bRet)
{
    strFileName + vctGuoJia.at(i++);
    bRet = FindIsFiles(lpszFolderPath, strCarName);///找CarName00到返回TRUE///没有找到说明文件不存在返回FALSE
    if (!bRet)
    {
        continue;
    }
    idx++;
}
vector<CString> cstrFilePath;
cstrFilePath.push_back(strCarName);

if (PathIsDirectory(lpszFolderPath+_T("\\"))==FILE_ATTRIBUTE_DIRECTORY)///判断输入路径是那种类型 1 文件夹 2 文件
{
    RenameCarBmp(lpszFolderPath, _T("car.bmp"), cstrFilePath); ///车型升级car.bmp这个地方出问题重命名图片名称
}

int nRet = -1;
for (int i=cstrFilePath.size()-1; i >= 0 ; i--)///这个地方是重命名文件夹和
{
    CString NewPathFrm = _T("");
    CString NewDstPathFrm = _T("");
    if (0 == i)///只重命名文件夹
    {
        NewPathFrm = lpszFolderPath;
        NewPathFrm +='\0';//注意必须是'\0'而不是"\0"!~!!
        NewDstPathFrm = lpszFolderPath+_T("\\")+cstrFilePath.at(i);

        lpszFolderPath = NewDstPathFrm;
    }
    else///文件夹和里面文件都进行重命名
    {
        CString strExt = _T("");

        NewPathFrm.Format(_T("0%d"), idx);

        strExt = cstrFilePath.at(i);
        strExt.Insert(strExt.ReverseFind('.'), NewPathFrm);
        if (strExt.Find(lpszFolderPath) == -1)
        {
            NewDstPathFrm = lpszFolderPath + _T("\\") + strExt;
            NewPathFrm = lpszFolderPath + _T("\\") +cstrFilePath.at(i);
        }
        else
        {
            NewDstPathFrm = strExt;
            NewPathFrm = cstrFilePath.at(i);
        }

        NewPathFrm +='\0';//注意必须是'\0'而不是"\0"!~!!
    }

    SHFILEOPSTRUCT FileOp;
    ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
    FileOp.fFlags = FOF_NOCONFIRMATION ;
    FileOp.hNameMappings = NULL;
    FileOp.hwnd = NULL;
    FileOp.lpszProgressTitle = NULL;
    FileOp.pFrom = NewPathFrm;
    FileOp.pTo = NewDstPathFrm;
    FileOp.wFunc = FO_RENAME;

    nRet = SHFileOperation(&FileOp);
}

return (nRet == 0);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值