VC中判断目录,文件是否存在,创建目录,求目录或文件大小的方法(转)
2011-03-31 16:45
转自:http://blog.sina.com.cn/s/blog_5f432e6a0100o0aj.html
目录是否存在检查:
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; }
|
文件存在性检查: 注意,该函数是检查当前目录下是否有该文件 如果想检查其他目录下是否有该文件,则在参数中输入该文件的完整路径即可
BOOL FileExist(CString strFileName) { CFileFind fFind; return fFind.FindFile(strFileName); }
|
创建目录:
BOOL CreateFolder(CString strPath) { SECURITY_ATTRIBUTES attrib; attrib.bInheritHandle = FALSE; attrib.lpSecurityDescriptor = NULL; attrib.nLength = sizeof(SECURITY_ATTRIBUTES); //上面定义的属性可以省略 //直接使用return ::CreateDirectory(path, NULL);即可 return ::CreateDirectory(strPath, &attrib); }
|
文件大小: 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; }
当然在CFileFind里面有GetLength()函数,也可以求得。
文件夹大小 DWORD CVCTestDlg::GetDirSize(CString strDirPath) { CString strFilePath; DWORD 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;
VC删除文件夹下所有文件的代码
//删除文件夹目录(非空)
bool DeleteDirectory(char* sDirName) { CFileFind tempFind; char sTempFileFind[200] ; sprintf(sTempFileFind,"%s\*.*",sDirName); BOOL IsFinded = tempFind.FindFile(sTempFileFind); while (IsFinded) { IsFinded = tempFind.FindNextFile(); if (!tempFind.IsDots()) { char sFoundFileName[200]; strcpy(sFoundFileName,tempFind.GetFileName().GetBuffer(200)); if (tempFind.IsDirectory()) { char sTempDir[200]; sprintf(sTempDir,"%s\%s",sDirName,sFoundFileName); DeleteDirectory(sTempDir); } else { char sTempFileName[200]; sprintf(sTempFileName,"%s\%s",sDirName,sFoundFileName); DeleteFile(sTempFileName); } } } tempFind.Close(); if(!RemoveDirectory(sDirName)) { return FALSE; } return TRUE; }
///////////////////////////////////////// //下面是应用,CString m_strDir 是一个文件夹路径,如:d:downloadpic
BOOL DelAll() { if(PathFileExists(m_strDir)) DeleteDirectory((LPSTR)(LPCTSTR)m_strDir); return 1; }
如果不进行递归删除。你可以使用API函数SHFileOperation,它可以一次删除目录及其下面的子目录和文件。
示例代码:
BOOL DelTree(LPCTSTR lpszPath)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = lpszPath;
FileOp.pTo = NULL;
FileOp.wFunc = FO_DELETE;
return SHFileOperation(&FileOp) == 0;
}
|