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

所属分类: 软件编程 / C 语言 阅读数: 72
收藏 0 赞 0 分享

一般来说,在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++程序设计有所帮助。

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多