VC文件目錄常見操作實例匯總
一般來說,在VC里文件操作有很多,本文在這里收錄了一些常見的函數(shù),分享給大家供大家參考。具體如下:
1. 判斷一個目錄是否存在
//參數(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ù):文件或目錄的完整名字(帶路徑),可以是文件名,也可以是目錄名
返回值: 如果存在,返回真,否則返回假。
{
CFileFind fFind;
return fFind.FindFile(strFileName);
}
3. 創(chuàng)建一個目錄
{
SECURITY_ATTRIBUTES attrib;
/*
設(shè)置目錄的常見屬性
*/
return ::CreateDirectory(strPath, &attrib);
}
4. 文件大?。?/strong>
參數(shù): 文件名字, 注意,如果給的是目錄(文件夾),該函數(shù)返回值不會遞歸計算目錄下所有文件大小。所以該函數(shù)只適 用于文件大小的統(tǒng)計。
返回值: 文件大小。單位為Byte。
{
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. 計算文件夾的大小
參數(shù):文件夾的完整路徑。該函數(shù)不使用與文件
返回值: 文件夾的大小,單位為byte。
{
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)用,因此如果是超大大的文件夾,或者文件夾下的子文件夾特別多,
則很有可能造成堆棧溢出。本人測試過系統(tǒng)目錄D和E,均沒有發(fā)生溢出。因此在一般情況下
可以使用。由于返回值為int64,int64表示的磁盤空間是相當(dāng)大的,也沒有溢出的可能。
6. 列出某目錄下的所有文件(不遞歸列出)
#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ò)展名列表,可以是多種類型的組合,比如說.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("http://*")); // 向字符串結(jié)尾添加/*, 用來查找所有文件
}
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) // 文件沒有擴(kuò)展名,跳過
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) //如果要求排序,對鏈表進(jìn)行排序
{
filenamelist.sort(); //list的排序采用的一般是merge sort
}
return filenamelist;
}
測試代碼如下:
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,因此有筆不菲的拷貝開銷。個人也不確定RVO(返回值)是否會被執(zhí)行,所以如果list很大很大的話,這確實是很糟糕的。解決方法是把list作為引用參數(shù)傳進(jìn)去。這樣就省了一次拷貝的開銷。
以上代碼均通過visual studio 2008編譯,測試運行。
感興趣的朋友可以測試運行一下本文實例以加深理解。希望本文所述對大家的C++程序設(shè)計有所幫助。
上一篇:VC使用TerminateProcess結(jié)束進(jìn)程實例
欄 目:C語言
本文標(biāo)題:VC文件目錄常見操作實例匯總
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3219.html
您可能感興趣的文章
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法
- 01-10顯示任何進(jìn)程加載的DLL文件的代碼
- 01-10深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文
- 01-10使用Inotify 監(jiān)控目錄與文件的方法詳解
- 01-10用c 獲取文件MD5值的實現(xiàn)方法
- 01-10用C實現(xiàn)添加和讀取配置文件函數(shù)
- 01-10在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法
- 01-10C++中簡單讀寫文本文件的實現(xiàn)方法
- 01-10C語言文件操作函數(shù)大全(超詳細(xì))


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)