1+ #include " FileSplitter.h"
2+
3+ using namespace std ;
4+
5+ void setConsoleColor (WORD color) {
6+ HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
7+ SetConsoleTextAttribute (hConsole, color);
8+ }
9+
10+ void displayMenu () {
11+ HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
12+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
13+ cout << R"(
14+ ______ _ _ _____ _ _ _ _
15+ | ___(_) | / ___| | (_) | | |
16+ | |_ _| | ___\ `--. _ __ | |_| |_| |_ ___ _ __
17+ | _| | | |/ _ \`--. \ '_ \| | | __| __/ _ \ '__|
18+ | | | | | __/\__/ / |_) | | | |_| || __/ |
19+ \_| |_|_|\___\____/| .__/|_|_|\__|\__\___|_|
20+ | |
21+ |_|
22+
23+ Github : https://github.com/TanevAZ
24+
25+ )" << endl;
26+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
27+
28+ cout << " \n [1] Exit [2] File Splitter\n " ;
29+ cout << " \n Option > " ;
30+ }
31+
32+ int main () {
33+ SetConsoleTitle (TEXT (" File Splitter" ));
34+ HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
35+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
36+
37+ displayMenu ();
38+
39+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
40+
41+ bool exitProgram = false ;
42+ int choice;
43+
44+ while (!exitProgram) {
45+ cin >> choice;
46+ switch (choice) {
47+ case 1 :
48+ exitProgram = true ;
49+ break ;
50+ case 2 : {
51+ // Get the input file name from the user.
52+ setConsoleColor (FOREGROUND_GREEN | FOREGROUND_INTENSITY);
53+ cout << " \n Enter the input file name: " ;
54+ string inputFileName;
55+ cin >> inputFileName;
56+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
57+
58+ // Check if the input file exists.
59+ if (!filesystem::exists (inputFileName)) {
60+ cout << " Error: Input file not found." << endl;
61+ continue ;
62+ }
63+
64+ // Get the size of the input file.
65+ long long fileSize = filesystem::file_size (inputFileName);
66+
67+ // Create a vector to store the split file names.
68+ vector<string> splitFileNames;
69+
70+ // Get the chunk size from the user (in MB).
71+ setConsoleColor (FOREGROUND_GREEN | FOREGROUND_INTENSITY);
72+ cout << " \n Enter the chunk size in MB: " ;
73+ double chunkSizeMB;
74+ cin >> chunkSizeMB;
75+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
76+
77+ long long chunkSize = static_cast <long long >(chunkSizeMB * 1024 * 1024 );
78+
79+ // Split the input file into chunks of the specified size.
80+ ifstream inputFile (inputFileName, ios::binary);
81+ for (long long i = 0 ; i < fileSize; i += chunkSize) {
82+ // Get the extension of the input file.
83+ string extension = inputFileName.substr (inputFileName.find_last_of (" ." ) + 1 );
84+
85+ // Create a new output file.
86+ string outputFileName = inputFileName + " .part" + to_string (i / chunkSize) + " ." + extension;
87+ ofstream outputFile (outputFileName, ios::binary);
88+
89+ // Calculate the actual chunk size to read in this iteration.
90+ long long remainingBytes = fileSize - i;
91+ long long bytesToRead = min (chunkSize, remainingBytes);
92+
93+ // Write the next chunk of the input file to the output file.
94+ vector<char > buffer (bytesToRead);
95+ inputFile.read (buffer.data (), bytesToRead);
96+ outputFile.write (buffer.data (), bytesToRead);
97+
98+ // Add the output file name to the vector of split file names.
99+ splitFileNames.push_back (outputFileName);
100+ }
101+
102+ // Print the list of split file names to the user.
103+ setConsoleColor (FOREGROUND_GREEN | FOREGROUND_INTENSITY);
104+ cout << " \n The split file names are: " << endl;
105+ for (const string& splitFileName : splitFileNames) {
106+ cout << splitFileName << endl;
107+ }
108+ SetConsoleTextAttribute (hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
109+
110+ break ;
111+ }
112+ default :
113+ cout << " Invalid option. Please try again." << endl;
114+ break ;
115+ }
116+
117+ // Display the menu again after finishing file splitting.
118+ displayMenu ();
119+ }
120+
121+ return 0 ;
122+ }
0 commit comments