欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

VC文件目錄常見(jiàn)操作實(shí)例匯總

 更新時(shí)間:2014年10月22日 11:29:01   投稿:shichen2014  
這篇文章主要介紹了VC文件目錄常見(jiàn)操作實(shí)例匯總,總結(jié)了VC針對(duì)文件目錄的各種常用操作,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

一般來(lái)說(shuō),在VC里文件操作有很多,本文在這里收錄了一些常見(jiàn)的函數(shù),分享給大家供大家參考。具體如下:

1. 判斷一個(gè)目錄是否存在

復(fù)制代碼 代碼如下:
#include "windows.h"

 //參數(shù): strPath: 目錄的完整路徑,注意不要以'/'結(jié)尾

 //返回值: 如果為目錄,返回真,否則返回假

  BOOL FolderExist(CString strPath)
 {
    WIN32_FIND_DATA wfd;
    BOOL rValue = FALSE;
    HANDLE hFind = FindFirstFile(strPath, &wfd);
    if ((hFind!=INVALID_HANDLE_VALUE) &&
         (wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
    {
        rValue = TRUE;
    }
    FindClose(hFind);
    return rValue;
 }

2. 判斷文件或目錄是否存在

參數(shù):文件或目錄的完整名字(帶路徑),可以是文件名,也可以是目錄名

返回值: 如果存在,返回真,否則返回假。

復(fù)制代碼 代碼如下:
BOOL  FileExist(CString strFileName)
{
    CFileFind fFind;
    return fFind.FindFile(strFileName);
}

3. 創(chuàng)建一個(gè)目錄

復(fù)制代碼 代碼如下:
BOOL CreateFolder(CString strPath)
{
    SECURITY_ATTRIBUTES attrib;
   /*

     設(shè)置目錄的常見(jiàn)屬性

     */
    return ::CreateDirectory(strPath, &attrib);
}

4. 文件大小:

參數(shù): 文件名字, 注意,如果給的是目錄(文件夾),該函數(shù)返回值不會(huì)遞歸計(jì)算目錄下所有文件大小。所以該函數(shù)只適           用于文件大小的統(tǒng)計(jì)。

返回值: 文件大小。單位為Byte。

復(fù)制代碼 代碼如下:
DWORD GetFileSize(CString filepath)
{
    WIN32_FIND_DATA fileInfo;
    HANDLE hFind;
    DWORD fileSize;
    CString filename;
    filename = filepath;
    hFind = FindFirstFile(filename,&fileInfo);
    if(hFind != INVALID_HANDLE_VALUE)
        fileSize = fileInfo.nFileSizeLow;
   
    FindClose(hFind);
    return fileSize ;
}

5. 計(jì)算文件夾的大小

參數(shù):文件夾的完整路徑。該函數(shù)不使用與文件

返回值: 文件夾的大小,單位為byte。

復(fù)制代碼 代碼如下:
int64 GetFolderSize(CString strDirPath)
{

    CString strFilePath;

    int64    dwDirSize = 0;
    strFilePath += strDirPath;
    strFilePath += "http://*.*";
    CFileFind finder;
    BOOL bFind = finder.FindFile(strFilePath);
    while (bFind)
    {
        bFind = finder.FindNextFile();
        if (!finder.IsDots())
        {
            CString strTempPath = finder.GetFilePath();
            if (!finder.IsDirectory())
            {
                dwDirSize += finder.GetLength();
            }
            else
            {
                dwDirSize += GetDirSize(strTempPath);
            }
        }
    }
    finder.Close();
    return dwDirSize;
}

由于該函數(shù)涉及到遞歸調(diào)用,因此如果是超大大的文件夾,或者文件夾下的子文件夾特別多,

則很有可能造成堆棧溢出。本人測(cè)試過(guò)系統(tǒng)目錄D和E,均沒(méi)有發(fā)生溢出。因此在一般情況下

可以使用。由于返回值為int64,int64表示的磁盤空間是相當(dāng)大的,也沒(méi)有溢出的可能。

6. 列出某目錄下的所有文件(不遞歸列出)

復(fù)制代碼 代碼如下:
  #include <Windows.h>
  #include <tchar.h>
  #include <list>
  #include <set>
  #include <cassert>
  #include <string>
  typedef std::basic_string<TCHAR> _tstring;  //寬字符串
  typedef std::list<_tstring> _tslist; //字符串鏈表
 /*

  返回文件名的鏈表。

  filepath  目錄的完整路徑,不帶//

  filefilterlist 文件擴(kuò)展名列表,可以是多種類型的組合,比如說(shuō).txt;.xls;.doc

  isordered  是否對(duì)文件名排序 

 */

_tslist  SearchFile(LPCTSTR filepath, LPCTSTR filefilterlist = _T(".*" ), bool isordered = true)

{

    assert(filepath != NULL);  

    TCHAR buffer[MAX_PATH];

#if _MSC_VER > 1310 

/* 1310 for Microsoft Visual C++ .NET 2003. 1310 represents /version 13 and a 1.0 point          release. The Visual C++ 2005 compiler version is 1400, the number.

*/

    _tcscpy_s(buffer, filepath); //_tcscpy_s is a micro for strcpy_s and strwcpy_s 

#else

    _tcscpy(buffer,filepath);  //

#endif

    _tslist filenamelist; // initial length is 100

    WIN32_FIND_DATA finddata;

    HANDLE searchhandle = INVALID_HANDLE_VALUE;

    size_t length= _tcslen(filepath);

    if (buffer[length-1] != _T('//'))
   {

        _tcscat_s(buffer,_T("http://*")); // 向字符串結(jié)尾添加/*, 用來(lái)查找所有文件
    }
    if ( (searchhandle = ::FindFirstFile(buffer, &finddata)) != INVALID_HANDLE_VALUE )
    {

      while (::FindNextFile(searchhandle, &finddata) != 0)
     {

        if ( !(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )   // 為文件            
       {
          if (  !_tcsicmp(filefilterlist, _T(".*")))   // 將所有文件輸出到鏈表

             filenamelist.push_back(finddata.cFileName);
          else
         {
            //get file filter list string, a example, file filter may be ".txt;.xls;.doc"
            _tstring filterstring = filefilterlist;
            _tstring filename(finddata.cFileName);
            _tstring::size_type index = filename.find_last_of(_T('.'));
            if (index == _tstring::npos) // 文件沒(méi)有擴(kuò)展名,跳過(guò)
               continue;
            else
           {
                 _tstring extname = filename.substr(index+1);  //取得文件的擴(kuò)展名
                _tstring::size_type exist;
                exist = filterstring.find(extname);
                if (exist != _tstring::npos)  //判斷文件的擴(kuò)展名是否在擴(kuò)展名列表里
                 filenamelist.push_back(finddata.cFileName);
              }
            }
         }
      }
    }
    ::FindClose( searchhandle );

    if (isordered)  //如果要求排序,對(duì)鏈表進(jìn)行排序
    {
        filenamelist.sort();  //list的排序采用的一般是merge sort
     }
    return filenamelist;
}

  測(cè)試代碼如下:

復(fù)制代碼 代碼如下:
  LPCTSTR s = _T("C://temp");
  LPCTSTR s1 = _T(".txt; .xls");
  _tslist filename = SearchFile(s,s1);

  copy( filename.begin(),
            filename.end(),
            ostream_iterator<_tstring, _tstring::value_type >(wcout, _T("/n") )
          );

由于函數(shù)返回的是list,因此有筆不菲的拷貝開(kāi)銷。個(gè)人也不確定RVO(返回值)是否會(huì)被執(zhí)行,所以如果list很大很大的話,這確實(shí)是很糟糕的。解決方法是把list作為引用參數(shù)傳進(jìn)去。這樣就省了一次拷貝的開(kāi)銷。

復(fù)制代碼 代碼如下:
void SearchFile(_tslist& list, LPCTSTR filepath, LPCTSTR filefilterlist = _T(".*" ), bool isordered = true)

以上代碼均通過(guò)visual studio 2008編譯,測(cè)試運(yùn)行。

感興趣的朋友可以測(cè)試運(yùn)行一下本文實(shí)例以加深理解。希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Valgrind是一款基于模擬linux下的程序調(diào)試器和剖析器的軟件套件,可以運(yùn)行于x86, amd64和ppc32架構(gòu)上。valgrind包含一個(gè)核心,它提供一個(gè)虛擬的CPU運(yùn)行程序,還有一系列的工具,它們完成調(diào)試,剖析和一些類似的任務(wù)
    2014-01-01
  • 手把手教你如何一眼分辨是C還是C++

    手把手教你如何一眼分辨是C還是C++

    在很大程度上,C++是C的超集,這意味著一個(gè)有效的C程序也是一個(gè)有效的C++程序,下面這篇文章主要給大家介紹了關(guān)于如何一眼分辨是C還是C++的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • C/C++后端學(xué)習(xí)與練習(xí)深入

    C/C++后端學(xué)習(xí)與練習(xí)深入

    這篇文章主要介紹了C/C++對(duì)于后端的學(xué)習(xí)與練習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Qt實(shí)現(xiàn)部件透明及陰影效果的示例代碼

    Qt實(shí)現(xiàn)部件透明及陰影效果的示例代碼

    本文主要介紹了Qt實(shí)現(xiàn)部件透明及陰影效果的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c++11中regex正則表達(dá)式示例簡(jiǎn)述

    c++11中regex正則表達(dá)式示例簡(jiǎn)述

    這篇文章主要給大家介紹了關(guān)于c++11中regex正則表達(dá)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++11具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C語(yǔ)言實(shí)現(xiàn)井字棋詳解

    C語(yǔ)言實(shí)現(xiàn)井字棋詳解

    這篇文章主要為大家介紹了C語(yǔ)言如何實(shí)現(xiàn)井字棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++利用循環(huán)和棧實(shí)現(xiàn)走迷宮

    C++利用循環(huán)和棧實(shí)現(xiàn)走迷宮

    這篇文章主要為大家詳細(xì)介紹了C++利用循環(huán)和棧實(shí)現(xiàn)走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++ 在堆上開(kāi)辟與釋放二維、三維指針詳細(xì)解析

    C++ 在堆上開(kāi)辟與釋放二維、三維指針詳細(xì)解析

    一維指針其實(shí)就相當(dāng)于一維數(shù)組,不用去看書(shū)上所說(shuō)的數(shù)組在內(nèi)存中的首地址這些晦澀的話,以此類推 二維指針就相當(dāng)于二維數(shù)組,新手對(duì)一維數(shù)組的開(kāi)辟與釋放比較容易熟悉
    2013-09-09
  • 淺談VC++中的內(nèi)聯(lián)

    淺談VC++中的內(nèi)聯(lián)

    在 Visual C++ 中使用內(nèi)聯(lián)匯編 一、內(nèi)聯(lián)匯編的優(yōu)缺點(diǎn) 因?yàn)樵赩isual C++中使用內(nèi)聯(lián)匯編不需要額外的編譯器和聯(lián)接器,且可以處理Visual C++ 中不能處理的一些事情,而且可以使用在 C/C++中的變量,所以非常方便。
    2015-07-07
  • vc中使用SendMessage自定義消息函數(shù)

    vc中使用SendMessage自定義消息函數(shù)

    這篇文章主要介紹了vc中使用SendMessage自定義消息函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06

最新評(píng)論