zoukankan      html  css  js  c++  java
  • MFC 文件,文件夹操作(转)

    文件属性相关

    1.判断文件是否存在

    利用CFile类和CFileStatus类判断

    CFileStatus filestatus;
    if (CFile::GetStatus(_T("d://softist.txt"), filestatus))
        AfxMessageBox(_T("文件存在"));
    else
        AfxMessageBox(_T("文件不存在"));

    利用CFileFind类判断

    CFileFind filefind;

    CString strPathname = _T("d://softist.txt");

    if(filefind.FindFile(strPathname))

        AfxMessageBox(_T("文件存在"));

    else

        AfxMessageBox(_T("文件不存在"));

     

     

     

     

     

    利用API函数FindFirstFile判断,这个函数还可以判断文件属性,日期,大小等属性。例:

    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    hFind = FindFirstFile(_T("d://softist.txt"), &FindFileData);
    if (hFind == INVALID_HANDLE_VALUE) 
    {
        AfxMessageBox(_T("文件不存在"));

    else 
    {
        AfxMessageBox(_T("文件存在"));
        FindClose(hFind);
    }

    2.文件日期操作。下面是取得"d://softist.txt"的文件修改时间,TRACE以后,再把文件修改时间改成 2000-12-03 12:34:56

    HANDLE     hFile;

    FILETIME   filetime;

    FILETIME   localtime;

    SYSTEMTIME systemtime;

     

    hFile = CreateFile(_T("d://softist.txt"), GENERIC_READ | GENERIC_WRITE,

         0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

     

    if (hFile != INVALID_HANDLE_VALUE)

    {

        GetFileTime(hFile, NULL, NULL, &filetime);      //取得UTC文件时间

        FileTimeToLocalFileTime(&filetime, &localtime); //换成本地时间

        FileTimeToSystemTime(&localtime, &systemtime);  //换成系统时间格式

     

        TRACE("%04d-%02d-%02d %02d:%02d:%02d/r/n",

              systemtime.wYear, systemtime.wMonth, systemtime.wDay,

              systemtime.wHour, systemtime.wMinute, systemtime.wSecond);

     

        //把文件时间修改成 2000-12-03 12:34:56

        systemtime.wYear = 2000; systemtime.wMonth = 12; systemtime.wDay = 3;

        systemtime.wHour = 12; systemtime.wMinute = 34; systemtime.wSecond = 56;

        SystemTimeToFileTime(&systemtime, &localtime); //换成文件时间格式

        LocalFileTimeToFileTime(&localtime, &filetime); //换成UTC时间

        SetFileTime(hFile, NULL, NULL, &filetime);  //设定UTC文件时间

        CloseHandle(hFile);

    }

    3.设置文件属性

    BOOL SetFileAttributes( LPCTSTR lpFileName, DWORD dwFileAttributes );

    dwFileAttributes 的意义

    FILE_ATTRIBUTE_ARCHIVE   保存文件

    FILE_ATTRIBUTE_HIDDEN    隐藏文件

    FILE_ATTRIBUTE_NORMAL   通常文件

    FILE_ATTRIBUTE_READONLY 只读文件

    FILE_ATTRIBUTE_SYSTEM   系统文件

    例:

    SetFileAttributes(_T("d://softist.txt", FILE_ATTRIBUTE_READONLY);

    文件的复制,移动,删除,更名

    1.文件的复制API

    BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);

    bFailIfExists用来制定如果目标文件已经存在时,是否中止复制操作,返回FALSE。例,把"d://softist1.txt"复制到"d://softist2.txt",即使"d://softist2.txt"已经存在。

    BOOL bRet = CopyFile(_T("d://softist1.txt"), _T("d://softist2.txt"), FALSE);

     

     

     

     

     

    2.文件的移动API

    BOOL MoveFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName );

    这个函数可以移一个文件,或目录(包括子目录),例,

    MoveFile(_T("d://softist.txt"), _T("d://softist2.txt"));

    下面的API带着选项dwFlags ,移动文件,或目录(包括子目录)。

    BOOL MoveFileEx( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags );

    dwFlags的意义: 

    MOVEFILE_REPLACE_EXISTING 如果目标文件存在是否替代它 

    MOVEFILE_DELAY_UNTIL_REBOOT 文件移动准备,下次启动系统时执行移动作业。

    3.删除文件

    API

    BOOL DeleteFile( LPCTSTR lpFileName );

    MFC

    static void PASCAL CFile::Remove(LPCTSTR lpszFileName);

    4.文件更名MFC

    TCHAR* pOldName = _T("Oldname_File.dat");

    TCHAR* pNewName = _T("Renamed_File.dat");

    try

    {

        CFile::Rename(pOldName, pNewName);

    }

    catch(CFileException* pEx )

    {

        TRACE(_T("File %20s not found, cause = %d/n"), pOldName,

        pEx->m_cause);

        pEx->Delete();

    }

    遍历文件目录

    遍历文件目录,即把一个目录里的文件以及子目录里的文件名都取出来。本文是CFileFind类的使用例的笔记。下面的程序是从一个目录出发,把这个目录里的所有成员按着层次TRACEDEBUG输出画面。

    void TravelFolder(CString strDir, int nDepth)

    {

        CFileFind filefind;                                         //声明CFileFind类型变量

        CString strWildpath = strDir + _T("//*.*");     //所有文件都列出。

        if(filefind.FindFile(strWildpath, 0))                    //开始检索文件

        {

            BOOL bRet = TRUE;

            while(bRet)

            {

                bRet = filefind.FindNextFile();                 //枚举一个文件

                if(filefind.IsDots())                                 //如果是 .. 做下一个

                    continue;

                for (int i = 0; i < nDepth; i ++)                 //层次空格打印

                {

                    TRACE(_T("    "));

                }

                if(!filefind.IsDirectory())                          //不是子目录,把文件名打印出来

                {

                    CString strTextOut = strDir + CString(_T("//")) + filefind.GetFileName();

                    TRACE(_T("file = %s/r/n"), strTextOut);

                }

                else                                                    //如果是子目录,递归调用该函数

                {

                    CString strTextOut = strDir + CString(_T("//")) + filefind.GetFileName();

                    TRACE(_T("dir = %s/r/n"), strTextOut);

                    TravelFolder(strTextOut, nDepth + 1);//递归调用该函数打印子目录里的文件

                }

            }

            filefind.Close();

        }

    }

    //测试,把d盘的/temp里的所有文件和子目录打印到DEBUG出画面

    void Test()

    {

        TravelFolder(CString(_T("d://temp")), 0);

    }

    文件目录操作

    1.创建目录(API)

    BOOL CreateDirectory(LPCTSTR pstrDirName);//pstrDirName是全路径

    2.删除目录(API)

    BOOL RemoveDirectory( LPCTSTR lpPathName );

    3.判断目录是否存在(Shell Function

    #include <shlwapi.h>#pragma comment(lib, "shlwapi.lib") if (PathIsDirectory(_T("d://temp"))) AfxMessageBox(_T("存在"));else AfxMessageBox(_T("不存在"));

     

     

     

     

     

    4.取得当前目录(API)

    DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer );

    5.取得执行文件所在目录(API)

    DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize );

    6.取得功能目录(Shell Function

    BOOL SHGetSpecialFolderPath( HWND hwndOwner,  LPTSTR lpszPath, int nFolder, BOOL fCreate);

    例:读取我的档案目录

        TCHAR szDirFile[1024];
        memset(szDirFile, 0, sizeof(szDirFile));
        BOOL bRet = SHGetSpecialFolderPath(NULL,szDirFile,CSIDL_PERSONAL,true);
        if (bRet)
        {
            AfxMessageBox(szDirFile);
        }

    7.选择目录用的对话框界面

    利用Shell Function可以打出选择目录用的对话框界面

     

    #include<shlobj.h>

    INT CALLBACK _BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM pData)

    {

        TCHAR szDir[MAX_PATH];

        switch(uMsg)

        {

        case BFFM_INITIALIZED:

            // WParam is TRUE since you are passing a path.

            // It would be FALSE if you were passing a pidl.

            SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)pData);

            break;

        case BFFM_SELCHANGED:

            // Set the status window to the currently selected path.

            if (SHGetPathFromIDList((LPITEMIDLIST)lParam ,szDir))

            {

                SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);

            }

            break;

        }

        return 0;

    }

     

    CString GetFolderFullpath(LPCTSTR lpszDefault)

    {

        TCHAR buffDisplayName[MAX_PATH];

        TCHAR fullpath[MAX_PATH];

        BROWSEINFO  browseinfo;

        LPITEMIDLIST lpitemidlist;

     

        ZeroMemory(&browseinfo, sizeof( BROWSEINFO ));

        browseinfo.pszDisplayName = buffDisplayName ;

        browseinfo.lpszTitle = _T("请选择目录");

        browseinfo.ulFlags = BIF_RETURNONLYFSDIRS;

        browseinfo.lParam = (LPARAM)lpszDefault;

        browseinfo.lpfn = _BrowseCallbackProc;

     

        if(!(lpitemidlist = SHBrowseForFolder(&browseinfo)))

        {

            AfxMessageBox(_T("没有选择目录"));

            return CString(_T(""));

        }

        else

        {

            SHGetPathFromIDList(lpitemidlist, fullpath);      

            CoTaskMemFree(lpitemidlist);

            return CString(fullpath);

        }

    }

     

    void CTest77Dlg::OnBnClickedButton1()

    {

        CString strFolderFullpath = GetFolderFullpath(_T("d://Temp"));

        if (strFolderFullpath != _T(""))

            AfxMessageBox(strFolderFullpath);

    }

  • 相关阅读:
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-结构
    c博客作业05--指针
    C博客作业04--数组
    博客作业03-函数
    循环结构
    c博客作业01--分支、顺序结构
    我的第一篇博客
    Macos安装JDK1.8
  • 原文地址:https://www.cnblogs.com/For-her/p/3630834.html
Copyright © 2011-2022 走看看