|
|
SysUtils.cpp - 시스템 관련 함수
등록자 : cpueblo (유광희), 2009-01-06
SysUtils.cpp - 시스템 관련 함수
광희가 쓰는 시스템 관련 함수 - SysUtils.cpp
#include "StdAfx.h"
#include "SysUtils.h"
#include // _stati64()
#include
#include
#include
#include
#include
#include
#pragma comment (lib, "shlwapi.lib")
#pragma comment (lib, "fdi.lib")
#pragma comment (lib, "shell32.lib")
namespace cpueblo
{
/*
//=====================================================
//
// GetFileSize_Stati64
//
//=====================================================
BOOL __fastcall GetFileSize_Stati64(const char *FileName, ULONGLONG *OutSize)
{
struct _stati64 statbuf;
if ( _stati64(FileName, &statbuf) )
return FALSE;
*OutSize = statbuf.st_size;
return TRUE;
}
//=====================================================
//
// GetFileSize
//
//=====================================================
BOOL __fastcall GetFileSize(const char *FileName, ULONGLONG *OutSize)
{
BOOL bRet = FALSE;
HANDLE FileHandle = CreateFile((LPCTSTR)FileName, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (FileHandle == INVALID_HANDLE_VALUE)
return FALSE;
bRet = GetFileSize(FileHandle, OutSize);
CloseHandle(FileHandle);
return bRet;
}
//=====================================================
//
// GetFileSize
//
//=====================================================
BOOL __fastcall GetFileSize(HANDLE FileHandle, ULONGLONG *OutSize)
{
DWORD dwSizeLow, dwSizeHigh;
dwSizeLow = ::GetFileSize(FileHandle, &dwSizeHigh);
if (dwSizeLow == 0xFFFFFFFF && GetLastError() != NO_ERROR)
return FALSE;
if (dwSizeHigh)
*OutSize = ((ULONGLONG)dwSizeHigh << 32) + (ULONGLONG)dwSizeLow;
else
*OutSize = (ULONGLONG)dwSizeLow;
return TRUE;
}
*/
//=====================================================
//
// SetFileSize
//
//=====================================================
BOOL __fastcall SetFileSize(const char *FileName, ULONGLONG NewFileSize)
{
LARGE_INTEGER li;
li.QuadPart = NewFileSize;
HANDLE FileHandle = ::CreateFile((LPCTSTR)FileName, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL);
if(FileHandle == INVALID_HANDLE_VALUE)
return FALSE;
// 파일 이동시의 High 비트는 지원하지 않음
SetFilePointer(FileHandle, li.LowPart, &li.HighPart, FILE_BEGIN);
if (!SetEndOfFile(FileHandle))
{
CloseHandle(FileHandle);
return FALSE;
}
CloseHandle(FileHandle);
return TRUE;
}
//===============================================
// GetMsToTimeString
//
// ms (밀리세컨드) 를 이쁘게 시간:분:초.ms 로 표시
//===============================================
char *GetMsToTimeString(LONG ms)
{
static char szStr[128];
LONG seconds = ms / 1000;
LONG minutes = seconds / 60;
LONG hours = minutes / 60;
sprintf(szStr, "%02d:%02d:%02d.%-3d", hours, minutes % 60, seconds % 60, ms % 1000);
return szStr;
}
//===============================================
// GetMsToMinString
//
// ms (밀리세컨드) 를 이쁘게 분:초로 표시
//===============================================
char *GetMsToMinString(LONG ms)
{
static char szStr[128];
LONG seconds = ms / 1000;
LONG minutes = seconds / 60;
sprintf(szStr, "%02d:%02d (sec)", minutes, seconds % 60);
return szStr;
}
FNFDINOTIFY(cpuebloFDNotify)
{
switch (fdint)
{
case fdintCOPY_FILE:
{
WIN32_FIND_DATA Item;
ZeroMemory(&Item, sizeof(WIN32_FIND_DATA));
strcpy(Item.cFileName, pfdin->psz1);
Item.nFileSizeHigh = 0;
Item.nFileSizeLow = pfdin->cb;
std::vector *lst = (std::vector *)pfdin->pv;
lst->push_back(Item);
/*
* Exit-Failure:
* Returns 0 => Skip file, do not copy
* Returns -1 => Abort FDICopy() call
*/
return 0;
}
default:
return 0;
}
}
//
// uses fdi.lib
//
bool GetFileListFromCAB(const char *CabFileName, std::vector *lst)
{
lst->clear();
BOOL bRet;
int nRet;
HFDI hRes;
FDICABINETINFO stInfo;
ERF stErr;
int iFile= 0;
CString strCab;
CString strFileName;
CString strCopyDir;
strCab = CabFileName;
strFileName = CabFileName;
hRes = FDICreate((PFNALLOC)&malloc, &free, (PFNOPEN)&_open, (PFNREAD)&_read, (PFNWRITE)&_write, &_close, &_lseek, cpuUNKNOWN, &stErr);
if (hRes == NULL)
return false;
iFile= _open(strCab.GetBuffer(0), _O_BINARY| _O_RDONLY);
if (iFile == -1)
return false;
bRet = FDIIsCabinet(hRes, iFile, &stInfo);
if (!bRet)
return false;
if (!FDICopy(hRes, strFileName.GetBuffer(0), strCopyDir.GetBuffer(0), 0, &cpuebloFDNotify, NULL, lst))
{
_close(iFile);
FDIDestroy(hRes);
// 에러 정보 작성
return false;
}
nRet = _close(iFile);
if (nRet != 0)
return false;
bRet = FDIDestroy(hRes);
if (!bRet)
return false;
return true;
}
//===============================================
// GetMsToMinString
//
// ms (밀리세컨드) 를 이쁘게 분:초로 표시 및 퍼센트 출력
//===============================================
char *GetMsToMinStringAndPer(LONG ms, LONG TotalMs)
{
static char szStr[128];
LONG seconds = ms / 1000;
LONG minutes = seconds / 60;
sprintf(szStr, "%-7d %02d:%02d (sec) - %3d% %%", ms, minutes, seconds % 60, (int)((double)ms / (double)TotalMs * 100));
return szStr;
}
void GetFindFileList(LPCTSTR pszDirectory, LPCTSTR pszFilter, std::vector *vtList, bool bFindSubDirectory)
{
TCHAR buf[_MAX_PATH];
WIN32_FIND_DATA FindFileData;
lstrcpy(buf, pszDirectory);
lstrcat(buf, "\\");
lstrcat(buf, pszFilter);
HANDLE hHandle=FindFirstFile(buf, &FindFileData);
for(;hHandle!=INVALID_HANDLE_VALUE;)
{
if( ( FindFileData.cFileName[0]!=_T('.') || lstrlen(FindFileData.cFileName)>2) &&
( 0 != _stricmp( FindFileData.cFileName, "Replay"))) // Replay 폴더는 지우지 않는다
{
lstrcpy(buf,pszDirectory);
lstrcat(buf,_T("\\"));
lstrcat(buf,FindFileData.cFileName);
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (bFindSubDirectory)
GetFindFileList(buf, pszFilter, vtList, bFindSubDirectory);
}
else
{
// printf("%s\r", buf);
vtList->push_back(buf);
}
}
if(!FindNextFile(hHandle,&FindFileData))
break;
}
FindClose(hHandle);
}
void GetFindFileListPathStrip(LPCTSTR pszDirectory, LPCTSTR pszFilter, std::vector *vtList, bool bFindSubDirectory)
{
TCHAR buf[_MAX_PATH];
WIN32_FIND_DATA FindFileData;
lstrcpy(buf, pszDirectory);
lstrcat(buf, "\\");
lstrcat(buf, pszFilter);
HANDLE hHandle=FindFirstFile(buf, &FindFileData);
for(;hHandle!=INVALID_HANDLE_VALUE;)
{
if( ( FindFileData.cFileName[0]!=_T('.') || lstrlen(FindFileData.cFileName)>2) &&
( 0 != _stricmp( FindFileData.cFileName, "Replay"))) // Replay 폴더는 지우지 않는다
{
lstrcpy(buf,pszDirectory);
lstrcat(buf,_T("\\"));
lstrcat(buf,FindFileData.cFileName);
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (bFindSubDirectory)
GetFindFileListPathStrip(buf, pszFilter, vtList, bFindSubDirectory);
}
else
{
// printf("%s\r", buf);
vtList->push_back(FindFileData.cFileName);
}
}
if(!FindNextFile(hHandle,&FindFileData))
break;
}
FindClose(hHandle);
}
//=====================================================
//
// DirectoryExists
//
//=====================================================
BOOL __fastcall DirectoryExists(const char *Directory)
{
return (BOOL)PathIsDirectory (Directory);
}
BOOL __fastcall DirectoryExists(const string &Directory)
{
return (BOOL)PathIsDirectory (Directory.c_str());
}
//=====================================================
//
// FileExists
//
//=====================================================
BOOL __fastcall FileExists(const char *FileName)
{
return PathFileExists (FileName);
}
BOOL __fastcall FileExists(const string &FileName)
{
return PathFileExists (FileName.c_str());
}
//=====================================================
//
// DeleteFile
//
//=====================================================
BOOL __fastcall DeleteFile(const string &FileName)
{
return ::DeleteFile(FileName.c_str());
}
//=====================================================
//
// ForceDirectories
//
//=====================================================
BOOL __fastcall ForceDirectories(const char *Dir)
{
return SHCreateDirectoryEx(NULL, Dir, NULL) == ERROR_SUCCESS ? TRUE : FALSE;
}
BOOL __fastcall ForceDirectories(const string &Dir)
{
return SHCreateDirectoryEx(NULL, Dir.c_str(), NULL) == ERROR_SUCCESS ? TRUE : FALSE;
}
//=====================================================
//
// ExtractFileDir
//
//=====================================================
string __fastcall ExtractFileDir(const string &FileName)
{
char Tmp[MAX_PATH];
strcpy(Tmp, FileName.c_str());
PathRemoveFileSpec(Tmp);
return Tmp;
}
//=====================================================
//
// ExtractFilePath
//
//=====================================================
string __fastcall ExtractFilePath(const string &FileName)
{
char Tmp[MAX_PATH];
strcpy(Tmp, FileName.c_str());
PathRemoveFileSpec(Tmp);
return Tmp + (string)"\\";
}
//=====================================================
//
// CreateDir
//
//=====================================================
BOOL __fastcall CreateDir(const string &Dir)
{
return _mkdir((const char *)Dir.c_str()) == 0 ? TRUE : FALSE;
}
//=====================================================
//
// RemoveDir
//
//=====================================================
BOOL __fastcall RemoveDir(const string &Dir)
{
return _rmdir((const char *)Dir.c_str()) == 0 ? TRUE : FALSE;
}
//=====================================================
//
// RemoveAllSubDir
//
//=====================================================
BOOL __fastcall RemoveAllSubDir(const string &Dir)
{
string Folder = RemovePathBackslash(Dir);
string Buf = Folder + "\\*.*";
WIN32_FIND_DATA FindFileData;
HANDLE hHandle;
hHandle=FindFirstFile(Buf.c_str(),&FindFileData);
if (hHandle == INVALID_HANDLE_VALUE)
return FALSE;
for(;hHandle;)
{
if (!strcmp(FindFileData.cFileName, ".") || !strcmp(FindFileData.cFileName, ".."))
;
else
{
Buf = Folder + "\\" + FindFileData.cFileName;
/*
strcpy(buf,pszDirectory);
strcat(buf,"\\");
strcat(buf,FindFileData.cFileName);
*/
if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
RemoveAllSubDir(Buf);
else
{
SetFileAttributes(Buf.c_str(), FILE_ATTRIBUTE_NORMAL);
DeleteFile(Buf.c_str());
NeoTrace("RemoveAllSubDir() 파일삭제 = %s\n", Buf.c_str());
}
}
if(!FindNextFile(hHandle,&FindFileData))
break;
}
FindClose(hHandle);
SetFileAttributes(Folder.c_str(),FILE_ATTRIBUTE_NORMAL);
NeoTrace("RemoveAllSubDir() DIR 삭제 = %s\n", Folder.c_str());
RemoveDirectory(Folder.c_str());
return TRUE;
}
//=====================================================
//
// GetDiskTotalSize
//
//=====================================================
__int64 __fastcall GetDiskTotalSize(const string &Dir)
{
BOOL bRet;
ULARGE_INTEGER FreeBytesAvailable;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
bRet = GetDiskFreeSpaceEx(Dir.c_str(), &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);
return bRet ? TotalNumberOfBytes.QuadPart : -1;
}
//=====================================================
//
// GetDiskFreeSize
//
//=====================================================
__int64 __fastcall GetDiskFreeSize(const string &Dir)
{
BOOL bRet;
ULARGE_INTEGER FreeBytesAvailable;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
bRet = GetDiskFreeSpaceEx(Dir.c_str(), &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);
return bRet ? TotalNumberOfFreeBytes.QuadPart : -1;
}
string __fastcall RemovePathFirstslash(const string &Path)
{
auto_ptr Temp( new char [Path.size() + 1]);
strcpy(Temp.get(), Path.c_str());
if (*(Temp.get()) == '\\' || *(Temp.get()) == '/')
strcpy((char *)Temp.get(), Temp.get() + 1);
return (string)Temp.get();
}
string __fastcall RemovePathBackslash(const string &Path)
{
auto_ptr Temp( new char [Path.size() + 1]);
strcpy(Temp.get(), Path.c_str());
::PathRemoveBackslash(Temp.get());
return (string)Temp.get();
}
string __fastcall RemoveFileExt(const string &FileName)
{
auto_ptr Temp( new char [FileName.size() + 1]);
strcpy(Temp.get(), FileName.c_str());
::PathRemoveExtension(Temp.get());
return (string)Temp.get();
}
//=====================================================
//
// GetFileSize
//
//=====================================================
__int64 __fastcall GetFileSize(const char *FileName)
{
struct _stati64 statbuf;
if ( _stati64(FileName, &statbuf) )
return -1;
return statbuf.st_size;
}
__int64 __fastcall GetFileSize(const string &FileName)
{
return GetFileSize(FileName.c_str());
}
__int64 __fastcall GetFileSize(const HANDLE Handle)
{
DWORD dwSizeLow, dwSizeHigh;
dwSizeLow = ::GetFileSize(Handle, &dwSizeHigh);
if (dwSizeLow == 0xFFFFFFFF && GetLastError() != NO_ERROR)
return -1;
if (dwSizeHigh)
return ((ULONGLONG)dwSizeHigh << 32) + (ULONGLONG)dwSizeLow;
else
return (ULONGLONG)dwSizeLow;
}
}
http://codesarang.com. mail to cpueblo cpueblo.com
|
|