CodeSarang.Com
Home | 전체 메뉴 | 질문/답변 Join | Login | 검색   

 

SysUtils.cpp - 시스템 관련 함수

등록자 : cpueblo (유광희), 2009-01-06

SysUtils.cpp - 시스템 관련 함수

광희가 쓰는 시스템 관련 함수 - SysUtils.cpp

#include "StdAfx.h" #include "SysUtils.h" #include <sys/stat.h> // _stati64() #include <fdi.h> #include <io.h> #include <fcntl.h> #include <direct.h> #include <shlobj.h> #include <shlwapi.h> #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<WIN32_FIND_DATA> *lst = (std::vector<WIN32_FIND_DATA> *)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<WIN32_FIND_DATA> *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 <std::string> *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 <std::string> *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<char> 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<char> 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<char> 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 cpueblocpueblo.com