MFC通过txt查找文件并进行复制-备忘

MFC基于对话框的Demo

txt中每行一个23位的卡号。

文件夹中包含以卡号命名的图像文件。(fpt或者bmp文件)

要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来。

VC6.0写的。

太懒了,代码以前写过,直接复制就OK。

**.cpp

下边的代码比较常用and改动比较大,备忘一下。

void CRenameFileDlg::OnButton1() 
{//按钮1
    UpdateData();
    char buf[MAX_PATH] = {0};
    if (select_any(buf))
    {
        m_pathname=buf;
        UpdateData(FALSE);
    }
    
}
void CRenameFileDlg::OnButton2() 
{//按钮2
    UpdateData();
    //生成一个打开对话框
    CFileDialog *lpszOpenFile;    
    lpszOpenFile = new CFileDialog
        (TRUE,"ccd.txt","",OFN_FILEMUSTEXIST |OFN_HIDEREADONLY , "文件类型(*.txt)|*.txt|所有文件(*.*)|*.*|");
    
    if(lpszOpenFile->DoModal() == IDOK )//假如点击对话框确定按钮
    {
        m_pathname2 = lpszOpenFile->GetPathName();//得到打开文件的路径
        SetWindowText(m_pathname2);//在窗口标题上显示路径
    }
    UpdateData(FALSE);
}
void CRenameFileDlg::OnButton3() 
{//按钮3
    
    UpdateData();
    char buf[MAX_PATH] = {0};
    if (select_any(buf))
    {
        m_newfilepath=buf;
        UpdateData(FALSE);
    }    
}
void CRenameFileDlg::OnBUTTON2ok() 
{//按钮4
    strtemp="";
    UpdateData();
    if (m_pathname=="")
    {
        MessageBox("请选择路径","提示",MB_OK);return;
    }

    h_FileFile(m_pathname);    ////
    theApp.AddtoTxt(strtemp);
    AfxMessageBox(" 操作已完成!");    
    
}

遍历文件夹并处理的模子函数。

void  CRenameFileDlg::h_FileFile(CString path)
{
    CString filePath=path+_T("//*.*");//能遍历所有子文件夹
    //CString filePath=path+_T("//*.bmp");  不能遍历
    CFileFind fileFinder;
    BOOL bFinished = fileFinder.FindFile(filePath);


    
    while(bFinished)  //每次循环对应一个类别目录
    { 
        bFinished = fileFinder.FindNextFile();        
        if(fileFinder.IsDirectory() && !fileFinder.IsDots())  //若是目录则递归调用此方法
        {
            h_FileFile(fileFinder.GetFilePath());
        }
        else  //判断文件名是否在txt中
        {
        
            //获取路径名  c:123456.bmp
             CString path2=fileFinder.GetFilePath();
            //获取文件名 456.bmp
            CString fileName = fileFinder.GetFileName();////获得不包含路径的  文件名.后缀 
        

        
            CString f_fix,f_fname;
            f_fix=fileName.Right(4);
            f_fname=fileName.Left(23);
            if (f_fix==".bmp")
            {
            
                /////////////////
            
                CStdioFile file;

            
                if(!file.Open(m_pathname2,CFile::modeRead))
                {
                    MessageBox("can not open file!");
                    return;
                }
                
                
                CString strLine,strTemp,strrow;  //strLine:txt每行的内容
                while(file.ReadString(strLine))
                {
                    CString str,p;
                    str= strLine.GetBufferSetLength(strLine.GetLength());
                    if(strLine!="")
                    {  
                    
                        if (f_fname==str.Left(23))//
                        {    
                            
                        //可以自己写各种处理函数

strtemp=strtemp+fileFinder.GetFilePath()+" "; } } } ////////////////////////// } }//end_else }//end while }

我常用的。

复制文件函数
函数原型
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists );

CopyFile(源文件,目标文件,FALSE);  //FALSE覆盖
CopyFile(c:123456.fpt,c:
ewfilefolder678.fpt,FALSE);


移动文件函数声明
BOOL MoveFile(
LPCTSTR lpExistingFileName, // file name
LPCTSTR lpNewFileName // new file name
);
用例
MoveFile("C:\File1.txt","C:\File3.txt");
函数功能
移动一个存在的文件或者目录(包括子目录)
参数说明
lpExistingFileName 一个存在的文件或者文件夹字符串指针
lpNewFileName 一个还没存在的文件或者文件夹的字符串指针



用法
DeleteFile 方法删除指定文件。
BOOL DeleteFile(
LPCSTRlpFileName//要删除的文件名的指针
);
参数
lpFileName
必选项。要删除文件的路径。
返回值
成功返回非零,失败返回0
更多错误信息使用GetLastError获取。
如果程序尝试删除一个不存在的文件。GetLastError返回ERROR_FILE_NOT_FOUND。如果文件是只读 的,则GetLastError返回ERROR_ACCESS_DENIED

//获取路径名
             CString path2=fileFinder.GetFilePath();    //AfxMessageBox("path2="+path2);
            //获取文件名
            CString fileName = fileFinder.GetFileName();

        
    CString DelfilePath;
    int dotPos33=path2.ReverseFind('\');
    DelfilePath=path2.Left(dotPos33)+'\';   
    
      //删除文件
            if (fileName.Find("-01.bmp")!=-1)
            {
                //AfxMessageBox("匹配删除  "+DelfilePath+fileName);
                DeleteFile(DelfilePath+fileName);
                
                
            }

---------End---------

CopyFile只能复制文件,不能复制该文件的文件夹,复制文件夹的代码  待验证。(懒,猴年马月 试试)

SHFILEOPSTRUCT   sfo; 
sfo.hwnd   =   NULL;
sfo.wFunc   =   FO_COPY;
sfo.pFrom   =   "c:\My_Docs1 ";  
sfo.pTo   =   "c:\My_Docs2 ";
sfo.fFlags   =   FOF_SILENT   |   FOF_NOCONFIRMATION   |   FOF_NOCONFIRMMKDIR;
hr   =   SHFileOperation(&sfo);

-------------

我想把一个文件夹移动到另一个路径,连同文件夹下的所有子文件和子文件夹!例如 f:a 是个文件夹,把整个 b 文件夹移动到 d: 。希望能通过一个函数来实现。假如函数为 Movefolder(CString s,CString d),c 和 d 分别保存着原文件夹和目标文件夹的路径。希望高人能给出完整的代码,如果参数不是CString的,能给出转换代码!!

BOOL MoveFolder(CString strSrcPath, CString strDestPath)
{
    strSrcPath += _T('');//注意这里一定要加_T(''),不要写成_T("");
    SHFILEOPSTRUCT si = {0};
    si.hwnd = ::GetDesktopWindow();
    si.wFunc = FO_COPY;
    si.pFrom = strSrcPath;
    si.pTo = strDestPath;
    si.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
 
    return 0 == SHFileOperation(&si);
}

----------
void myCopyDirectory(CString source, CString target)  
{  
    CreateDirectory(target,NULL); //创建目标文件夹  
    //AfxMessageBox("创建文件夹"+target);  
    CFileFind finder;  
    CString path;  
        path.Format("%s/*.*",source);  
    AfxMessageBox(path);  
    bool bWorking = finder.FindFile(path);  
    while(bWorking){  
        bWorking = finder.FindNextFile();  
        AfxMessageBox(finder.GetFileName());  
        if(finder.IsDirectory() && !finder.IsDots()){ //是文件夹 而且 名称不含 . 或 ..  
            myCopyDirectory(finder.GetFilePath(),target+"/"+finder.GetFileName()); //递归创建文件夹+"/"+finder.GetFileName()  
        }  
        else{ //是文件 则直接复制  
            //AfxMessageBox("复制文件"+finder.GetFilePath());//+finder.GetFileName()  
            CopyFile(finder.GetFilePath(),target+"/"+finder.GetFileName(),FALSE);  
        }  
    }  
}
原文地址:https://www.cnblogs.com/china-hxx/p/5714553.html