时间:2021-05-20
一般来说,在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; //字符串链表
_tslist SearchFile(LPCTSTR filepath, LPCTSTR filefilterlist = _T(".*" ), bool isordered = true)
{
assert(filepath != NULL);
TCHAR buffer[MAX_PATH];
#if _MSC_VER > 1310
_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++程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文汇总了VC6.0常用的快捷键操作,熟练掌握这些快捷键操作,对于进行VC程序开发效率的提高有很大的帮助!常用快捷键详细汇总如下:1.检测程序中的括号是否匹配把
本文实例讲述了VC判断一个文件为目录的方法,分享给大家供大家参考。具体实现方法如下:这是一个自定义函数,用于判断一个文件是否为目录:复制代码代码如下:/***c
文件目录切换在linux中是很常见的操作,刚学linux时,最先接触到的命令就是文件切换。pwd:显示当前所在目录~:root目录/:根目录ls:查看当前目录下
1.下载以下两个文件,放入phpext目录及system32php_sqlsrv_52_ts_vc6.dll(线程安全)php_sqlsrv_52_nts_vc
本文实例汇总了Java文件操作。分享给大家供大家参考,具体如下:1.创建文件夹//importjava.io.*;FilemyFolderPath=newFil