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++程序设计有所帮助。

(0)

相关推荐

  • VC中删除类的两种操作方法

    本文实例讲述了VC中删除类的两种操作方法.分享给大家供大家参考.具体方法如下: 方法一: 应该是先在windows里面删除.h和.cpp文件,然后打开项目,Ctrl-W打开Class    wizard,选这个Dialog类,然后提示找不到了,选remove,然后到File    view列表里面选这两个文件,按Delete删除,这样才彻底,否则.clw文件内会保留信息的 方法二: 在你的工程的FileView中删除相应的h文件和cpp文件,然后把工程关了 到相应文件夹下,把该类的h和cpp文件

  • VC++操作SQLite简单实例

    对于很多程序员来说,SQLite并不陌生.SQLite 是一款主要用于嵌入式的开源数据库,可集成在自己的桌面程序中,也可替代Access作为后台数据库.SQLite 支持多数SQL92标准,例如:索引.限制.触发和查看支持,支持 NULL.INTEGER.REAL.TEXT 和 BLOB 数据类型,支持事务.以下是一些SQLite的简单使用. //建立数据库 C:\sqlite-3_6_11> sqlite3.exe dbname.db 建立数据库的时候sqlite3.exe后面跟数据库文件名

  • VC实现批量删除指定文件的方法

    本文所述实例主要实现了删除某个盘符下指定位置的文件,可以是TXT.doc.jpeg等格式,只要选定格式后,再定义好盘符,即可一键删除所有指定类型的文件.再次提示删除前请确认,且删除后不可恢复. 以下是最主要的核心代码,其它代码读者可以自己添加. SHFILEINFO shInfo; memset(&shInfo,0,sizeof(SHFILEINFO)); HIMAGELIST hImage = (HIMAGELIST)SHGetFileInfo("C:\\",0,&s

  • 教你全面认识操作系统的svchost进程

    很多朋友对svchost.exe进程都不太了解,有时在任务管理器中一旦看到有多个该进程(图1中有6个),就以为自己的电脑中了病毒或木马,其实并非如此!正常情况下,Windows中可以有多个svchost.exe进程同时运行,例如Windows 2000至少有2个svchost进程,Windows XP中有4个以上,Windows 2003中则有更多,所以当你看到多个svchost进程时,未必就是病毒! svchost.exe进程是干什么的? svchost.exe文件存在于"%system ro

  • VC实现ODBC数据库操作实例解析

    本文以VC实例介绍了实现数据库操作的各种方法,包括打开数据库.关联记录集.读取Excel数据.执行SQL查询.创建存取字符串等,相信对于初学VC的朋友有一定的参考价值,主要功能代码如下: //打开数据库 CDatabase database; database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue为数据源名称 //关联记录集 CRecordset recset(&database); //查询记

  • VC文件目录常见操作实例汇总

    一般来说,在VC里文件操作有很多,本文在这里收录了一些常见的函数,分享给大家供大家参考.具体如下: 1. 判断一个目录是否存在 复制代码 代码如下: #include "windows.h" //参数: strPath: 目录的完整路径,注意不要以'/'结尾 //返回值: 如果为目录,返回真,否则返回假 BOOL FolderExist(CString strPath)  {     WIN32_FIND_DATA wfd;     BOOL rValue = FALSE;     H

  • Android中数据库常见操作实例分析

    本文实例讲述了Android中数据库常见操作.分享给大家供大家参考,具体如下: android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它数据库操作本质上都是一样的,大同小异.需要的一些基本解释都在代码中,直接上代码了. 简单的代码文件目录: 首先这个类是数据库帮助类,DBHelper.java,代码如下: package net.loonggg.db;

  • Python字符串的常见操作实例小结

    本文实例讲述了Python字符串的常见操作.分享给大家供大家参考,具体如下: 如果我们想要查看以下功能:help(mystr .find) 1.find 例: mystr="hello world itcast" print(mystr.find("world")) 结果为 6 find括号中填写要查找的内容,如果找不到返回-1,找到返回从左往右找到的第一个位置 2.index 功能和find一样,只是找不到时,这个返回错误 3.rfind 从右往左找的第一个位置

  • jQuery中DOM常见操作实例小结

    本文实例讲述了jQuery中DOM常见操作.分享给大家供大家参考,具体如下: DOM属性操作 属性列表 属性 版本 说明 attr() 1.0 设置或返回文档节点的属性. removeAttr() 1.0 移除文档节点的属性. prop() 1.6 设置或返回DOM元素的属性. removeProp() 1.6 移除每个匹配元素的属性. addClass() 1.0 添加CSS类名. removeClass() 1.0 移除CSS类名. toggleClass() 1.2 切换CSS类名(存在就

  • Python字典常见操作实例小结【定义、添加、删除、遍历】

    本文实例总结了Python字典常见操作.分享给大家供大家参考,具体如下: 简单的字典: 字典就是键值对key-value组合. #字典 键值对组合 alien_0 ={'color':'green','number':5} print(alien_0['color']) print(alien_0['number']) 运行结果: green 5 添加键值对 alien_0 ={'color':'green','number':5} alien_0['first_name'] = 'mo' al

  • MySQL单表查询常见操作实例总结

    本文实例总结了MySQL单表查询常见操作.分享给大家供大家参考,具体如下: 创建fruits表: CREATE TABLE fruits ( f_id char(10) NOT NULL, s_id INT NOT NULL, f_name char(255) NOT NULL, f_price decimal(8,2) NOT NULL, PRIMARY KEY(f_id) ) ; INSERT INTO fruits (f_id, s_id, f_name, f_price) VALUES(

  • Python文件常见操作实例分析【读写、遍历】

    本文实例讲述了Python文件常见操作.分享给大家供大家参考,具体如下: 1.文件是什么? 文件是存储在外部介质上的数据或信息集合,程序中源程序.数据中保存的数据.图像中的像素数据等等: 文件是有序的数据序列: 2.编码: 信息从一种形式转换为另一种形式的过程:ascII码.Unicode.utf-8等等: 二进制文件ascII码:照片.音乐.视频.计算机程序... 3.文件的基本操作 1)打开文件获取文件对象 建立磁盘上的文件与源程序中的对象相关联,程序上叫打开文件,一旦文件被打开,文件的内容

  • Java最全文件操作实例汇总

    本文实例汇总了Java文件操作.分享给大家供大家参考,具体如下: 1.创建文件夹 //import java.io.*; File myFolderPath = new File(%%1); try { if (!myFolderPath.exists()) { myFolderPath.mkdir(); } } catch (Exception e) { System.out.println("新建目录操作出错"); e.printStackTrace(); } 2.创建文件 //i

  • AngularJS日期格式化常见操作实例分析

    本文实例讲述了AngularJS日期格式化常见操作.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> <meta charset="UTF-8"> <title>www.jb51.net AngularJS日期格式化</title> <script src="http

  • js DOM的事件常见操作实例详解

    本文实例讲述了js DOM的事件常见操作.分享给大家供大家参考,具体如下: 一.JavaScript的组成 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的元素的API.比如让盒子移动.变色.轮播图等. BOM:浏览器对象模型,操作浏览器部分功能的API.比如让浏览器自动滚动. 二.事件 JS是以事件驱动为核心的一门语言. 事件的三要素 事件的三要素:事件源.

随机推荐