程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> VC文件目次罕見操作實例匯總

VC文件目次罕見操作實例匯總

編輯:關於C++

VC文件目次罕見操作實例匯總。本站提示廣大學習愛好者:(VC文件目次罕見操作實例匯總)文章只能為提供參考,不一定能成為您想要的結果。以下是VC文件目次罕見操作實例匯總正文


普通來講,在VC裡文件操作有許多,本文在這裡收錄了一些罕見的函數,分享給年夜家供年夜家參考。詳細以下:

1. 斷定一個目次能否存在

#include "windows.h"

 //參數: strPath: 目次的完全途徑,留意不要以'/'開頭

 //前往值: 假如為目次,前往真,不然前往假

  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. 斷定文件或目次能否存在

參數:文件或目次的完全名字(領路徑),可所以文件名,也能夠是目次名

前往值: 假如存在,前往真,不然前往假。

BOOL  FileExist(CString strFileName)
{
    CFileFind fFind;
    return fFind.FindFile(strFileName);
}

3. 創立一個目次

BOOL CreateFolder(CString strPath)
{
    SECURITY_ATTRIBUTES attrib;
   /*

     設置目次的罕見屬性

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

4. 文件年夜小:

參數: 文件名字, 留意,假如給的是目次(文件夾),該函數前往值不會遞歸盤算目次下一切文件年夜小。所以該函數只適           用於文件年夜小的統計。

前往值: 文件年夜小。單元為Byte。

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. 盤算文件夾的年夜小

參數:文件夾的完全途徑。該函數不應用與文件

前往值: 文件夾的年夜小,單元為byte。

int64 GetFolderSize(CString strDirPath)
{

    CString strFilePath;

    int64    dwDirSize = 0;
    strFilePath += strDirPath;
    strFilePath += "//*.*";
    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;
}

因為該函數觸及到遞歸挪用,是以假如是超年夜年夜的文件夾,或許文件夾下的子文件夾特殊多,

則很有能夠形成客棧溢出。自己測試過體系目次D和E,均沒有產生溢出。是以在普通情形下

可使用。因為前往值為int64,int64表現的磁盤空間是相當年夜的,也沒有溢出的能夠。

6. 列出某目次下的一切文件(不遞歸列出)

  #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 文件擴大名列表,可所以多品種型的組合,好比說.txt;.xls;.doc

  isordered  能否對文件名排序 

 */

_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("//*")); // 向字符串開頭添加/*, 用來查找一切文件
    }
    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) // 文件沒有擴大名,跳過
               continue;
            else
           {
                 _tstring extname = filename.substr(index+1);  //獲得文件的擴大名
                _tstring::size_type exist;
                exist = filterstring.find(extname);
                if (exist != _tstring::npos)  //斷定文件的擴大名能否在擴大名列內外
                 filenamelist.push_back(finddata.cFileName);
              }
            }
         }
      }
    }
    ::FindClose( searchhandle );

    if (isordered)  //假如請求排序,對鏈表停止排序
    {
        filenamelist.sort();  //list的排序采取的普通是merge sort
     }
    return filenamelist;
}

  測試代碼以下:

  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") )
          );

因為函數前往的是list,是以有筆不菲的拷貝開支。小我也不肯定RVO(前往值)能否會被履行,所以假如list很年夜很年夜的話,這確切是很蹩腳的。處理辦法是把list作為援用參數傳出來。如許就省了一次拷貝的開支。

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

以上代碼均經由過程visual studio 2008編譯,測試運轉。

感興致的同伙可以測試運轉一下本文實例以加深懂得。願望本文所述對年夜家的C++法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved