出自ProgWiki
用途
程式碼
FileOperation.h
#pragma once
#include <afxtempl.h>
class CFileOperation
{
public:
CFileOperation(void);
~CFileOperation(void);
int DeleteFile(LPTSTR szSrcFile);
int CopyFile(LPTSTR szSrcFile, LPTSTR szDestFile);
int MoveFile(LPTSTR szSrcFile, LPTSTR szDestFile);
int RenameFile(LPTSTR szSrcFile, LPTSTR szDestFile);
void Recurse(LPTSTR pstr);
int CreateFolder(LPTSTR strFolder);
ULONGLONG GetFileSize(LPTSTR lpszFileName);
BOOL IsFileExists(LPTSTR lpszFileName);
BOOL IsFolderExists(LPTSTR lpszFolderName);
public:
HWND m_hWnd;
CStringArray m_FileArray;
CStringArray m_FolderArray;
WORD m_Flags;
};
FileOperation.cpp
#include "StdAfx.h"
#include "FileOperation.h"
#include <shlobj.h>
#include <shlwapi.h>
#include <Shellapi.h>
#pragma comment(lib, "Shlwapi.lib")
CFileOperation::CFileOperation(void)
{
m_hWnd = NULL;
m_Flags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
}
CFileOperation::~CFileOperation(void)
{
}
int CFileOperation::DeleteFile(LPTSTR szSrcFile)
{
SHFILEOPSTRUCT fop;
TCHAR szSrc[MAX_PATH];
StrCpy(szSrc, szSrcFile);
szSrc[_tcslen(szSrcFile)+1] = _T('\0');
fop.hwnd = m_hWnd;
fop.wFunc = FO_DELETE;
fop.pFrom = szSrc;
fop.fFlags = m_Flags;
return ( SHFileOperation( &fop ) );
}
int CFileOperation::CopyFile(LPTSTR szSrcFile, LPTSTR szDestFile)
{
SHFILEOPSTRUCT fop;
TCHAR szSrc[MAX_PATH];
TCHAR szDest[MAX_PATH];
StrCpy(szSrc, szSrcFile);
szSrc[_tcslen(szSrcFile)+1] = _T('\0');
StrCpy(szDest, szDestFile);
szDest[_tcslen(szDestFile)+1] = _T('\0');
fop.hwnd = m_hWnd;
fop.wFunc = FO_COPY;
fop.pFrom = szSrc;
fop.pTo = szDest;
fop.fFlags = m_Flags;
return ( SHFileOperation( &fop ) );
}
int CFileOperation::MoveFile(LPTSTR szSrcFile, LPTSTR szDestFile)
{
SHFILEOPSTRUCT fop;
TCHAR szSrc[MAX_PATH];
TCHAR szDest[MAX_PATH];
StrCpy(szSrc, szSrcFile);
szSrc[_tcslen(szSrcFile)+1] = _T('\0');
StrCpy(szDest, szDestFile);
szDest[_tcslen(szDestFile)+1] = _T('\0');
fop.hwnd = m_hWnd;
fop.wFunc = FO_MOVE;
fop.pFrom = szSrc;
fop.pTo = szDest;
fop.fFlags = m_Flags;
return ( SHFileOperation( &fop ) );
}
int CFileOperation::RenameFile(LPTSTR szSrcFile, LPTSTR szDestFile)
{
SHFILEOPSTRUCT fop;
TCHAR szSrc[MAX_PATH];
TCHAR szDest[MAX_PATH];
StrCpy(szSrc, szSrcFile);
szSrc[_tcslen(szSrcFile)+1] = _T('\0');
StrCpy(szDest, szDestFile);
szDest[_tcslen(szDestFile)+1] = _T('\0');
fop.hwnd = m_hWnd;
fop.wFunc = FO_RENAME;
fop.pFrom = szSrc;
fop.pTo = szDest;
fop.fFlags = m_Flags;
return ( SHFileOperation( &fop ) );
}
int CFileOperation::CreateFolder(LPTSTR strFolder)
{
BOOL bRet;
CStringArray m_PathArray;
CString sTempPath;
m_PathArray.Add(strFolder);
while (!m_PathArray.IsEmpty())
{
sTempPath = m_PathArray.ElementAt(m_PathArray.GetSize()-1);
bRet = ::CreateDirectory(sTempPath, NULL);
if (bRet != FALSE)
{
//成功 break;
m_PathArray.RemoveAt(m_PathArray.GetSize()-1);
}
else
{
//不成功
CString sTemp;
if (sTempPath[ sTempPath.GetLength()-1] == '\\')
{
sTemp = sTempPath.Left(sTempPath.GetLength()-1);
}
else
{
sTemp = sTempPath;
}
int nPos = sTemp.ReverseFind('\\');
sTempPath = sTemp.Left(nPos+1);
m_PathArray.Add(sTempPath);
}
}
return 0;
}
void CFileOperation::Recurse(LPTSTR pstr)
{
CFileFind finder;
CString strWildcard;
::PathCombine(strWildcard.GetBuffer(MAX_PATH), pstr, _T("*.*"));
strWildcard.ReleaseBuffer();
// start working for files
BOOL bWorking = finder.FindFile(strWildcard);
while (bWorking)
{
bWorking = finder.FindNextFile();
// skip . and .. files; otherwise, we'd
// recur infinitely!
if (finder.IsDots())
continue;
// if it's a directory, recursively search it
CString str = finder.GetFilePath();
if (finder.IsDirectory())
{
m_FolderArray.Add(str);
Recurse(str.GetBuffer());
}
else
{
m_FileArray.Add(str);
}
}
finder.Close();
}
ULONGLONG CFileOperation::GetFileSize(LPTSTR lpszFileName)
{
//1.檔案是否存在
if (!IsFileExists(lpszFileName))
{
return 0;
}
CFile file;
if (file.Open(lpszFileName, CFile::modeRead, NULL) != FALSE)
{
//2.取檔案Size
return file.GetLength();
}
return 0;
}
BOOL CFileOperation::IsFileExists(LPTSTR lpszFileName)
{
// A quick'n'easy way to see if a file exists.
DWORD dwAttributes = GetFileAttributes(lpszFileName);
if (dwAttributes == 0xFFFFFFFF)
return FALSE;
if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
return FALSE;
}
return TRUE;
}
BOOL CFileOperation::IsFolderExists(LPTSTR lpszFolderName)
{
// A quick'n'easy way to see if a file exists.
DWORD dwAttributes = GetFileAttributes(lpszFolderName);
if (dwAttributes == 0xFFFFFFFF)
return FALSE;
if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
{
return FALSE;
}
return TRUE;
}