FileOperation.cpp

出自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;
}
個人工具
名字空間
變換
動作
導航
分類
其他
技術類News或部落格
工具箱