From f8c4f0fcabb78ff4975d70047315cae687fa250b Mon Sep 17 00:00:00 2001 From: Juno Kim Date: Fri, 28 Aug 2026 15:31:04 +0900 Subject: [PATCH] done with FileReader --- Target_Dir/Sub_Dir_1/Sub_Text1.txt | 1 + Target_Dir/Text.txt | 1 + MyZip.txt => Target_File.txt | 0 main.cpp | 222 +++++++++++++++-------------- 4 files changed, 116 insertions(+), 108 deletions(-) create mode 100644 Target_Dir/Sub_Dir_1/Sub_Text1.txt create mode 100644 Target_Dir/Text.txt rename MyZip.txt => Target_File.txt (100%) diff --git a/Target_Dir/Sub_Dir_1/Sub_Text1.txt b/Target_Dir/Sub_Dir_1/Sub_Text1.txt new file mode 100644 index 0000000..c941d94 --- /dev/null +++ b/Target_Dir/Sub_Dir_1/Sub_Text1.txt @@ -0,0 +1 @@ +Hello DNS! \ No newline at end of file diff --git a/Target_Dir/Text.txt b/Target_Dir/Text.txt new file mode 100644 index 0000000..c941d94 --- /dev/null +++ b/Target_Dir/Text.txt @@ -0,0 +1 @@ +Hello DNS! \ No newline at end of file diff --git a/MyZip.txt b/Target_File.txt similarity index 100% rename from MyZip.txt rename to Target_File.txt diff --git a/main.cpp b/main.cpp index 59483c3..536b44e 100644 --- a/main.cpp +++ b/main.cpp @@ -1,122 +1,26 @@ -#include +// 1. C++ 표준 라이브러리 (C 호환 및 C++ 표준을 알파벳 순으로 통합하거나 C/C++ 분리) #include +#include #include -#include - +#include #include #include -#include - #include +#include + +// 2. OS 전용 / 플랫폼 API (Windows) +#include #include #include "ZipDefine.h" #include "CRC.h" -#define INPUT_FILE_NAME "MyZip.txt" +#define INPUT_FILE_NAME "Target_Dir" #define OUTPUT_FILE_NAME "MyZip.zip" -static uint32_t RECURSIVE_COUNTER = 0; +static uint32_t g_recursive_counter = 0; -bool searchDir() -{ - -} - -bool FileReader(std::string strInputPath) -{ - using namespace std; - bool iRet = true; - - // path class obj 생성. - filesystem::path pathObj(strInputPath); - - // file valid check - if (!filesystem::exists(pathObj)) - { - string strDbg = "[ERROR] File not found : " + pathObj.string(); - OutputDebugStringA(strDbg.c_str()); - iRet = false; - } - enum class eFILETYPE - { - isFile, isDir, ETC - }; - - // distinguish file type - eFILETYPE eFileDist; - if (filesystem::is_directory(pathObj)) eFileDist = eFILETYPE::isDir; - else if (filesystem::is_regular_file(pathObj)) eFileDist = eFILETYPE::isFile; - else eFileDist = eFILETYPE::ETC; - - switch (eFileDist) - { - // case 1 : input file - case eFILETYPE::isFile: - { - ZipArchiver(pathObj.string()); - - break; - } - // case 2 : input directory - case eFILETYPE::isDir: - { - // make iterator to traversal - filesystem::directory_iterator itrDir(pathObj); - while (itrDir != filesystem::end(itrDir)) - { - // get entry one by one - const filesystem::directory_entry& currentEntry = *itrDir; - if (filesystem::is_directory(currentEntry)) - { - RECURSIVE_COUNTER++; - string strDbg = "[INFO] Current Entry (Dir)\t: " + currentEntry.path().string() + "\t Counter : " + to_string(RECURSIVE_COUNTER); - OutputDebugStringA(strDbg.c_str()); - - // recursive traversal - iRet = FileReader(currentEntry.path().string()); - } - else if (filesystem::is_regular_file(currentEntry)) - { - RECURSIVE_COUNTER++; - string strDbg = "[INFO] Current Entry (File)\t: " + currentEntry.path().string() + "\t Counter : " + to_string(RECURSIVE_COUNTER); - OutputDebugStringA(strDbg.c_str()); - - // archiving file - ZipArchiver(currentEntry.path().string()); - } - else - { - // TODO : 근데 애초에 제 3의 Type 이 있나? (여기 의미 있는건가?) - OutputDebugStringA("[ERROR] Wrong Type of File"); - iRet = false; - } - - // step forward entry - itrDir++; - } - - break; - } - // case 3 : ERROR - case eFILETYPE::ETC: - { - // 이런 경우가 있으려나? 일단 혹시 모르니까 - string strErr = "[ERROR] Something went Wrong..!!"; - OutputDebugStringA(strErr.c_str()); - - iRet = false; - //break; - } - default: - break; - } - - // TODO : 실패 상황 별 다른 코드 부여 + 코드 별 처리 어떻게 할 건지? - return iRet; -} - -bool ZipArchiver(std::string strInputPath) +bool ZipArchiver(std::string strInputPath, std::string strFileName) { LocalFileHeader LFHeader{}; CentralDirectory CentDir{}; @@ -174,7 +78,7 @@ bool ZipArchiver(std::string strInputPath) CentDir.sizeOfCompressed = CentDir.sizeOfUncompressed; // Put File name length - uint16_t fileNameLeng = static_cast(strlen(INPUT_FILE_NAME)); + uint16_t fileNameLeng = static_cast(strFileName.length()); LFHeader.lengthOfFileName = fileNameLeng; CentDir.lengthOfFileName = fileNameLeng; @@ -238,13 +142,115 @@ bool ZipArchiver(std::string strInputPath) return iRet; } +bool FileReader(std::string strInputPath) +{ + using namespace std; + bool iRet = true; + + // path class obj 생성. + filesystem::path pathObj(strInputPath); + + // file valid check + if (!filesystem::exists(pathObj)) + { + string strDbg = "[ERROR] File not found : " + pathObj.string(); + strDbg += "\r\n"; + OutputDebugStringA(strDbg.c_str()); + iRet = false; + } + enum class eFILETYPE + { + isFile, isDir, ETC + }; + + // distinguish file type + eFILETYPE eFileDist; + if (filesystem::is_directory(pathObj)) eFileDist = eFILETYPE::isDir; + else if (filesystem::is_regular_file(pathObj)) eFileDist = eFILETYPE::isFile; + else eFileDist = eFILETYPE::ETC; + + switch (eFileDist) + { + // case 1 : input file + case eFILETYPE::isFile: + { + iRet = ZipArchiver(pathObj.string(), pathObj.filename().string()); + + break; + } + // case 2 : input directory + case eFILETYPE::isDir: + { + // make iterator to traversal + filesystem::directory_iterator itrDir(pathObj); + while (itrDir != filesystem::end(itrDir)) + { + // get entry one by one + const filesystem::directory_entry& currentEntry = *itrDir; + const filesystem::path& currentPath = currentEntry.path(); + if (filesystem::is_directory(currentEntry)) + { + g_recursive_counter++; + // TODO : export to debugging log function + string strDbg = "[INFO] Current Entry (Dir)\t: " + currentPath.string(); + strDbg += "\t Counter : " + to_string(g_recursive_counter); + strDbg += "\r\n"; + OutputDebugStringA(strDbg.c_str()); + + // recursive traversal + iRet = FileReader(currentPath.string()); + g_recursive_counter--; + } + else if (filesystem::is_regular_file(currentEntry)) + { + // TODO : export to debugging log function + string strDbg = "[INFO] Current Entry (File)\t: " + currentPath.string(); + strDbg += "\t Counter : " + to_string(g_recursive_counter); + strDbg += "\r\n"; + + OutputDebugStringA(strDbg.c_str()); + + // archiving file + iRet = ZipArchiver(currentPath.string(), currentPath.filename().string()); + } + else + { + // TODO : 근데 애초에 제 3의 Type 이 있나? (여기 의미 있는건가?) + OutputDebugStringA("[ERROR] Wrong Type of File"); + iRet = false; + } + + // step forward entry + itrDir++; + } + + break; + } + // case 3 : ERROR + case eFILETYPE::ETC: + { + // 이런 경우가 있으려나? 일단 혹시 모르니까 + string strErr = "[ERROR] Something went Wrong..!!"; + OutputDebugStringA(strErr.c_str()); + + iRet = false; + break; + } + default: + break; + }; + + // TODO : 실패 상황 별 다른 코드 부여 + 코드 별 처리 어떻게 할 건지? + return iRet; +} + int main() { std::printf("==================== Hello Zip! ====================\r\n"); int iRet = 0; // Main Zip archive method - if (!FileReader()) + if (!FileReader(INPUT_FILE_NAME)) { iRet = -1; std::printf("[ ERROR ] Somthing went Wrong... \r\n");