Last active
September 25, 2015 04:09
-
-
Save LusainKim/5f8e6d3ab73aa4106ac8 to your computer and use it in GitHub Desktop.
FileCopy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <windows.h> | |
#include <conio.h> | |
#include <iostream> | |
#include <vector> | |
#include <fstream> | |
#include <string> | |
using namespace std; | |
#define ONE_READ_BUF_SIZE 512 | |
typedef struct str | |
{ | |
size_t _size; | |
char _str[ONE_READ_BUF_SIZE]; | |
str(char* p, size_t size = 0) { _size = size; memcpy(_str, p, ONE_READ_BUF_SIZE); } | |
str(size_t size = 0) { _size = size; ZeroMemory(_str, ONE_READ_BUF_SIZE); } | |
}str; | |
template<typename NumType = unsigned int> | |
string FixValue(NumType fixnum) | |
{ | |
string strfix; | |
int count = 0; | |
int endnum; | |
while (fixnum > 0) | |
{ | |
strfix += ('0' + (fixnum % 10)); | |
fixnum /= 10; | |
if (fixnum > 0 && ++count % 3 == 0) | |
strfix += ','; | |
} | |
if (count == 0) | |
return string("0"); | |
return string(strfix.rbegin(),strfix.rend()); | |
} | |
/////////////////////////////////////////////////////////////////////////// | |
// console cursor | |
HANDLE consoleHandler = GetStdHandle(STD_OUTPUT_HANDLE); | |
int gotoxy(int x, int y) | |
{ | |
if (consoleHandler == INVALID_HANDLE_VALUE) | |
return 0; | |
COORD coords = { static_cast<short>(x), static_cast<short>(y) }; | |
SetConsoleCursorPosition(consoleHandler, coords); | |
return 1; | |
} | |
int wherex() | |
{ | |
if (consoleHandler == INVALID_HANDLE_VALUE) | |
return 0; | |
CONSOLE_SCREEN_BUFFER_INFO screenInfo; | |
GetConsoleScreenBufferInfo(consoleHandler, &screenInfo); | |
return screenInfo.dwCursorPosition.X; | |
} | |
int wherey() | |
{ | |
if (consoleHandler == INVALID_HANDLE_VALUE) | |
return 0; | |
CONSOLE_SCREEN_BUFFER_INFO screenInfo; | |
GetConsoleScreenBufferInfo(consoleHandler, &screenInfo); | |
return screenInfo.dwCursorPosition.Y; | |
} | |
/////////////////////////////////////////////////////////////////////////// | |
bool LoadFile(vector<str>& newFile) | |
{ | |
string strFilename; | |
cout << "input file : "; | |
cin >> strFilename; | |
fstream fs(strFilename, ios::in | ios::binary); | |
fs.imbue(locale("korean")); | |
// check succese | |
if (fs.is_open()) cout << strFilename << " is open!" << endl; | |
else { | |
cout << strFilename << " is not exist!" << endl; | |
return false; | |
} | |
// size check; | |
fs.seekg(0, fstream::end); | |
size_t szData = fs.tellg(); | |
fs.seekg(0); | |
// draw percent | |
int nowper = 0; | |
int size_div_100 = int(szData / 100); | |
if ((szData % 100) > 0) size_div_100++; | |
str* pStr = nullptr; | |
for (int i = 0; i < szData; i+= ONE_READ_BUF_SIZE) | |
{ | |
newFile.push_back(str(min(szData - i, ONE_READ_BUF_SIZE))); | |
pStr = &newFile.back(); | |
fs.read(pStr->_str, pStr->_size); | |
// draw percent | |
if (nowper != i / (size_div_100)) | |
{ | |
nowper++; | |
// 커서 초기화 | |
gotoxy(0, wherey()); | |
for (int ido = 0; ido < (nowper / 10); ++ido) | |
cout << "■"; | |
if (nowper < 100) (nowper % 10 > 0) ? cout << "▤" : cout << "□"; | |
for (int ido = (nowper / 10) + 1; ido < 10; ++ido) | |
cout << "□"; | |
cout << " : " << nowper << "%"; | |
} | |
} | |
fs.close(); | |
// 커서 초기화 | |
gotoxy(0, wherey()); | |
for (int ido = 0; ido < 10; ++ido) cout << "■"; | |
cout << " : 100%"; | |
cout << endl << endl << "complete!" << endl; | |
cout << strFilename << " is " << FixValue(szData) << " bytes." << endl; | |
return true; | |
} | |
void SaveFile(vector<str>& newFile) | |
{ | |
string strExtend; | |
cout << "new program name is : "; | |
cin >> strExtend; | |
fstream fn(strExtend, ios::out | ios::binary); | |
fn.imbue(locale("korean")); | |
size_t cnt = 0; | |
size_t szDataBlock = newFile.size(); | |
// draw percent | |
int nowper = 0; | |
int szDataBlock_div_100 = int(szDataBlock / 100); | |
if ((szDataBlock % 100) > 0) szDataBlock_div_100++; | |
size_t szData = 0; | |
for (auto p : newFile) | |
{ | |
fn.write(p._str, p._size); | |
szData += p._size; | |
// draw percent | |
if (nowper != cnt++ / (szDataBlock_div_100)) | |
{ | |
nowper++; | |
// 커서 초기화 | |
gotoxy(0, wherey()); | |
for (int ido = 0; ido < (nowper / 10); ++ido) | |
cout << "■"; | |
if(nowper < 100) ( nowper % 10 > 0) ? cout << "▤" : cout << "□"; | |
for (int ido = (nowper / 10) + 1; ido < 10; ++ido) | |
cout << "□"; | |
cout << " : " << nowper << "%"; | |
} | |
} | |
// 커서 초기화 | |
gotoxy(0, wherey()); | |
for (int ido = 0; ido < 10; ++ido) cout << "■"; | |
cout << " : 100%"; | |
cout << endl << endl << "File save succese!" << endl; | |
cout << "File size is " << FixValue(szData) << " bytes." << endl; | |
fn.close(); | |
} | |
int main() | |
{ | |
vector<str> newFile; | |
if (!LoadFile(newFile)) | |
{ | |
system("pause"); | |
system("cls"); | |
return main(); | |
} | |
SaveFile(newFile); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
dpqld에베데베에에베에벱데덷 ㅔstl이네영