zipfile ์์นด์ด๋ธ ์์ฑ ๋ฐ ์ถ์ถ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋๋ก, ๋ชจ๋ฒ ์ฌ๋ก, ํ๋ซํผ ํธํ์ฑ, ๋ณด์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๊ณ ๊ธ ๊ธฐ์ ์ ๊ฐ๋ฐ์ ๋ฐ ์์คํ ๊ด๋ฆฌ์์๊ฒ ์ ๊ณตํฉ๋๋ค.
Zipfile ์์นด์ด๋ธ ์ฒ๋ฆฌ: ํ๋ซํผ ๊ฐ ์์ฑ ๋ฐ ์ถ์ถ
Zipfile ์์นด์ด๋ธ๋ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ถํ๊ณ ๋ฌถ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋๋ฆฌ ์ฑํ๋์ด ๋ฐ์ดํฐ ๊ด๋ฆฌ, ์ํํธ์จ์ด ๋ฐฐํฌ ๋ฐ ์์นด์ด๋น์ ํ์์ ์ ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ๋ค์ํ ๋๊ตฌ, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฐ ๋ค์ํ ํ๋ซํผ์์ ํธํ์ฑ ๋ฐ ๋ณด์์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ฉด์ zipfile ์์นด์ด๋ธ์ ์์ฑ ๋ฐ ์ถ์ถ์ ํ๊ตฌํฉ๋๋ค.
Zipfile ์์นด์ด๋ธ ์ดํด
zipfile ์์นด์ด๋ธ๋ ํ๋ ์ด์์ ์์ถ๋ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋จ์ผ ํ์ผ์ ๋๋ค. zip ํ์์ DEFLATE์ ๊ฐ์ ๋ฌด์์ค ๋ฐ์ดํฐ ์์ถ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ์ฌ ์์นด์ด๋ธ๋ ๋ฐ์ดํฐ์ ์ ์ฒด ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค. ๋ฐ๋ผ์ zip ํ์ผ์ ๋คํธ์ํฌ๋ฅผ ํตํด ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , ๋ฐฑ์ ์ ์ ์ฅํ๊ณ , ์ํํธ์จ์ด ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ์ด์์ ์ ๋๋ค.
Zipfile ์ฌ์ฉ์ ์ด์
- ์์ถ: ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ์ ํ์ํ ์ ์ฅ ๊ณต๊ฐ์ ์ค์ ๋๋ค.
- ๋ฒ๋ค๋ง: ์ฌ๋ฌ ํ์ผ์ ๋จ์ผํ๊ณ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ์์นด์ด๋ธ๋ก ๊ฒฐํฉํฉ๋๋ค.
- ์ด์์ฑ: Zipfile์ ๊ด๋ฒ์ํ ์ด์ ์ฒด์ ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ง์๋ฉ๋๋ค.
- ๋ณด์: Zipfile์ ๋ฌด๋จ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ํธ๋ก ๋ณดํธํ ์ ์์ต๋๋ค.
- ๋ฐฐํฌ: ์ํํธ์จ์ด ๋ฐ ๋ฐ์ดํฐ ๋ฐฐํฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
Zipfile ์์นด์ด๋ธ ์์ฑ
์ด์ ์ฒด์ ๋ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ์ ๋ฐ๋ผ zipfile ์์นด์ด๋ธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ด ์น์ ์์๋ ๋ช ๋ น์ค ์ธํฐํ์ด์ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋ชจ๋ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ดํด๋ด ๋๋ค.
๋ช ๋ น์ค ๋๊ตฌ
๋๋ถ๋ถ์ ์ด์ ์ฒด์ ์๋ zipfile์ ๋ง๋ค๊ณ ์ถ์ถํ๊ธฐ ์ํ ๋ช ๋ น์ค ๋๊ตฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ถ๊ฐ ์ํํธ์จ์ด๊ฐ ํ์ ์์ด ์์นด์ด๋ธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
Linux ๋ฐ macOS
zip
๋ช
๋ น์ Linux ๋ฐ macOS ์์คํ
์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. zipfile ์์นด์ด๋ธ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ญ์์ค.
zip archive_name.zip file1.txt file2.txt directory1/
์ด ๋ช
๋ น์ file1.txt
, file2.txt
๋ฐ directory1
์ ๋ด์ฉ์ ํฌํจํ๋ archive_name.zip
์ด๋ผ๋ ์์นด์ด๋ธ๋ฅผ ๋ง๋ญ๋๋ค.
๊ธฐ์กด ์์นด์ด๋ธ์ ํ์ผ์ ์ถ๊ฐํ๋ ค๋ฉด:
zip -u archive_name.zip file3.txt
๊ธฐ์กด ์์นด์ด๋ธ์์ ํ์ผ์ ์ญ์ ํ๋ ค๋ฉด:
zip -d archive_name.zip file1.txt
Windows
Windows์๋ ๊ธฐ๋ณธ ์ ๊ณต zipfile ์ง์์ ์ ๊ณตํ๋ powershell
๋ช
๋ น์ค ์ ํธ๋ฆฌํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์์นด์ด๋ธ๋ฅผ ๋ง๋ค๋ ค๋ฉด:
Compress-Archive -Path 'file1.txt', 'file2.txt', 'directory1' -DestinationPath 'archive_name.zip'
์ด ๋ช
๋ น์ ์ง์ ๋ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํ๋ archive_name.zip
์ด๋ผ๋ ์์นด์ด๋ธ๋ฅผ ๋ง๋ญ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ zipfile ์์นด์ด๋ธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ถํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์น์ ์์๋ Python ๋ฐ Java๋ฅผ ์ฌ์ฉํ์ฌ ์์นด์ด๋ธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
Python
Python์ zipfile
๋ชจ๋์ zipfile ์์นด์ด๋ธ๋ฅผ ์ฌ์ฉํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ์์นด์ด๋ธ๋ฅผ ๋ง๋๋ ์์
๋๋ค.
import zipfile
def create_zip(file_paths, archive_name):
with zipfile.ZipFile(archive_name, 'w') as zip_file:
for file_path in file_paths:
zip_file.write(file_path)
# Example usage:
file_paths = ['file1.txt', 'file2.txt', 'directory1/file3.txt']
archive_name = 'archive.zip'
create_zip(file_paths, archive_name)
์ด ์ฝ๋ ์ค๋ํซ์ ํ์ผ ๊ฒฝ๋ก ๋ชฉ๋ก๊ณผ ์์นด์ด๋ธ ์ด๋ฆ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ํจ์ create_zip
์ ์ ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ง์ ๋ ํ์ผ์ ํฌํจํ๋ zipfile ์์นด์ด๋ธ๋ฅผ ๋ง๋ญ๋๋ค.
zip ์์นด์ด๋ธ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ถ๊ฐํ๋ ค๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค.
import zipfile
import os
def create_zip(root_dir, archive_name):
with zipfile.ZipFile(archive_name, 'w', zipfile.ZIP_DEFLATED) as zip_file:
for root, _, files in os.walk(root_dir):
for file in files:
file_path = os.path.join(root, file)
zip_file.write(file_path, os.path.relpath(file_path, root_dir))
# Example Usage:
root_dir = 'my_directory'
archive_name = 'my_archive.zip'
create_zip(root_dir, archive_name)
์ด ์ฝ๋๋ `my_directory`๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํ์ํ๊ณ ์์นด์ด๋ธ ๋ด์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ๊ทธ ์์ ์๋ ๋ชจ๋ ํ์ผ์ zip ์์นด์ด๋ธ์ ์ถ๊ฐํฉ๋๋ค.
Java
Java์ java.util.zip
ํจํค์ง๋ zipfile ์์นด์ด๋ธ ์์
์ ์ํ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ์์นด์ด๋ธ๋ฅผ ๋ง๋๋ ์์
๋๋ค.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipCreator {
public static void main(String[] args) {
String[] filePaths = {"file1.txt", "file2.txt", "directory1/file3.txt"};
String archiveName = "archive.zip";
try {
FileOutputStream fos = new FileOutputStream(archiveName);
ZipOutputStream zipOut = new ZipOutputStream(fos);
for (String filePath : filePaths) {
File fileToZip = new File(filePath);
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
fis.close();
zipOut.closeEntry();
}
zipOut.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
์ด ์ฝ๋ ์ค๋ํซ์ ์ง์ ๋ ํ์ผ์ ํฌํจํ๋ archive.zip
์ด๋ผ๋ zipfile ์์นด์ด๋ธ๋ฅผ ๋ง๋ญ๋๋ค. ์ ์ฌ์ ์ธ `IOExceptions`๋ฅผ catchํ๊ธฐ ์ํด ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Zipfile ์์นด์ด๋ธ ์ถ์ถ
zipfile ์์นด์ด๋ธ ์ถ์ถ์ ์์นด์ด๋ธ๋ฅผ ๋ง๋๋ ๊ฒ๋งํผ ์ค์ํฉ๋๋ค. ์ด ์น์ ์์๋ ๋ช ๋ น์ค ๋๊ตฌ ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์นด์ด๋ธ๋ฅผ ์ถ์ถํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
๋ช ๋ น์ค ๋๊ตฌ
Linux ๋ฐ macOS
unzip
๋ช
๋ น์ Linux ๋ฐ macOS ์์คํ
์์ zipfile ์์นด์ด๋ธ๋ฅผ ์ถ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์นด์ด๋ธ์ ๋ด์ฉ์ ์ถ์ถํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ญ์์ค.
unzip archive_name.zip
์ด ๋ช
๋ น์ archive_name.zip
์ ๋ด์ฉ์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์ถ์ถํฉ๋๋ค.
์์นด์ด๋ธ๋ฅผ ํน์ ๋๋ ํ ๋ฆฌ์ ์ถ์ถํ๋ ค๋ฉด:
unzip archive_name.zip -d destination_directory
Windows
Windows๋ PowerShell์์ zip ํ์ผ์ ์ถ์ถํ๊ธฐ ์ํด Expand-Archive
cmdlet์ ์ ๊ณตํฉ๋๋ค.
Expand-Archive -Path 'archive_name.zip' -DestinationPath 'destination_directory'
`-DestinationPath` ๋งค๊ฐ๋ณ์๋ฅผ ์๋ตํ๋ฉด ๋ด์ฉ์ด ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์ถ์ถ๋ฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
Python
Python์ zipfile
๋ชจ๋์ ์์นด์ด๋ธ๋ฅผ ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๊ทธ ์์
๋๋ค.
import zipfile
def extract_zip(archive_name, destination_directory):
with zipfile.ZipFile(archive_name, 'r') as zip_file:
zip_file.extractall(destination_directory)
# Example usage:
archive_name = 'archive.zip'
destination_directory = 'extracted_files'
extract_zip(archive_name, destination_directory)
์ด ์ฝ๋ ์ค๋ํซ์ ์์นด์ด๋ธ ์ด๋ฆ๊ณผ ๋์ ๋๋ ํ ๋ฆฌ๋ฅผ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ํจ์ extract_zip
์ ์ ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์นด์ด๋ธ์ ๋ด์ฉ์ ์ง์ ๋ ๋๋ ํ ๋ฆฌ์ ์ถ์ถํฉ๋๋ค.
Java
Java์ java.util.zip
ํจํค์ง๋ ์์นด์ด๋ธ๋ฅผ ์ถ์ถํ๊ธฐ ์ํ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๊ทธ ์์
๋๋ค.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipExtractor {
public static void main(String[] args) {
String archiveName = "archive.zip";
String destinationDirectory = "extracted_files";
try {
File destDir = new File(destinationDirectory);
if (!destDir.exists()) {
destDir.mkdirs();
}
FileInputStream fis = new FileInputStream(archiveName);
ZipInputStream zipIn = new ZipInputStream(fis);
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
String filePath = destinationDirectory + File.separator + entry.getName();
if (!entry.isDirectory()) {
// if the entry is a file, extracts it
extractFile(zipIn, filePath);
} else {
// if the entry is a directory, make the directory
File dir = new File(filePath);
dir.mkdirs();
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
zipIn.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
try (FileOutputStream bos = new FileOutputStream(filePath)) {
byte[] bytesIn = new byte[1024];
int read = 0;
while ((read = zipIn.read(bytesIn)) != -1) {
bos.write(bytesIn, 0, read);
}
}
}
}
์ด ์ฝ๋ ์ค๋ํซ์ archive.zip
์ ๋ด์ฉ์ extracted_files
๋๋ ํ ๋ฆฌ์ ์ถ์ถํฉ๋๋ค. `extractFile` ๋ฉ์๋๋ ์์นด์ด๋ธ์์ ๊ฐ๋ณ ํ์ผ์ ์ถ์ถ์ ์ฒ๋ฆฌํ๊ณ , ์ฝ๋๋ zip ์์นด์ด๋ธ์ ๋๋ ํ ๋ฆฌ ํญ๋ชฉ์ด ํฌํจ๋ ๊ฒฝ์ฐ ๋๋ ํ ๋ฆฌ ์์ฑ๋ ์ฒ๋ฆฌํฉ๋๋ค. try-with-resources๋ฅผ ์ฌ์ฉํ์ฌ ์คํธ๋ฆผ์ ์๋์ผ๋ก ๋ซ๊ณ ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๊ณ ๊ธ ๊ธฐ์
๊ธฐ๋ณธ ์์ฑ ๋ฐ ์ถ์ถ ์ธ์๋ zipfile ์์นด์ด๋ธ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ณดํธํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ํธ ๋ณดํธ
Zipfile์ ์์นด์ด๋ธ๋ ๋ฐ์ดํฐ์ ๋ํ ๋ฌด๋จ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ํธ๋ก ๋ณดํธํ ์ ์์ต๋๋ค. zipfile ์ํธ ๋ณดํธ๋ ๋น๊ต์ ์ฝํ์ง๋ง ์ค์ํ ๋ฐ์ดํฐ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์์ค์ ๋ณด์์ ์ ๊ณตํฉ๋๋ค.
๋ช ๋ น์ค
Linux/macOS์์ zip
๋ช
๋ น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
zip -e archive_name.zip file1.txt file2.txt
์ด ๋ช ๋ น์ ์ํธ๋ฅผ ๋ฌป๋ ๋ฉ์์ง๋ฅผ ํ์ํ๋ฉฐ, ์ด ์ํธ๋ ์์นด์ด๋ธ๋ฅผ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
PowerShell์ zip ์์นด์ด๋ธ๋ฅผ ๋ง๋ค ๋ ์ํธ ๋ณดํธ๋ฅผ ์ง์ ์ง์ํ์ง ์์ต๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ก๊ทธ๋จ์ด ํ์ํฉ๋๋ค.
Python
Python์ zipfile
๋ชจ๋์ ์ํธ ๋ณดํธ๋ฅผ ์ง์ํ์ง๋ง ์ฌ์ฉ๋ ์ํธํ ๋ฐฉ๋ฒ(ZipCrypto)์ด ์ฝํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ค์ํ ๋ฐ์ดํฐ์๋ ๋ ๊ฐ๋ ฅํ ์ํธํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
import zipfile
def create_password_protected_zip(file_paths, archive_name, password):
with zipfile.ZipFile(archive_name, 'w', zipfile.ZIP_DEFLATED) as zip_file:
for file_path in file_paths:
zip_file.setpassword(password.encode('utf-8'))
zip_file.write(file_path)
# Example usage:
file_paths = ['file1.txt', 'file2.txt']
archive_name = 'protected_archive.zip'
password = 'my_secret_password'
create_password_protected_zip(file_paths, archive_name, password)
Python์์ ์ํธ๋ก ๋ณดํธ๋ zipfile์ ์ถ์ถํ๋ ค๋ฉด:
import zipfile
def extract_password_protected_zip(archive_name, destination_directory, password):
with zipfile.ZipFile(archive_name, 'r') as zip_file:
zip_file.setpassword(password.encode('utf-8'))
zip_file.extractall(destination_directory)
# Example Usage
archive_name = 'protected_archive.zip'
destination_directory = 'extracted_files'
password = 'my_secret_password'
extract_password_protected_zip(archive_name, destination_directory, password)
์ฐธ๊ณ : ์ํธ๋ utf-8๋ก ์ธ์ฝ๋ฉ๋์ด์ผ ํฉ๋๋ค.
Java
Java์ ๊ธฐ๋ณธ ์ ๊ณต java.util.zip
ํจํค์ง๋ ํ์ค ZIP ์ํธํ(ZipCrypto)๋ฅผ ์ฌ์ฉํ์ฌ ์ํธ ๋ณดํธ๋ฅผ ์ง์ ์ง์ํ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Java์์ zip ํ์ผ์ ๋ํ ์ํธ ๋ณดํธ๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด TrueZIP ๋๋ ์ ์ฌํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ค์ ๋ณด์ ์ฐธ๊ณ ์ฌํญ: ZipCrypto๋ ์ฝํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ค์ํ ๋ฐ์ดํฐ์ ์์กดํ์ง ๋ง์ญ์์ค. ๊ฐ๋ ฅํ ๋ณด์์ ์ํด AES์ ๊ฐ์ ๋ ๊ฐ๋ ฅํ ์ํธํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋์ฉ๋ ์์นด์ด๋ธ ์ฒ๋ฆฌ
๋์ฉ๋ ์์นด์ด๋ธ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฑ๋ฅ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ์์นด์ด๋ธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ๋ ๋์ฉ๋ ์์นด์ด๋ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Python
Python์ `zipfile` ๋ชจ๋์ ํฐ ํ์ผ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋งค์ฐ ํฐ ์์นด์ด๋ธ์ ๊ฒฝ์ฐ `extractall()`์ ์ฌ์ฉํ๋ ๋์ ์์นด์ด๋ธ์ ๋ด์ฉ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
import zipfile
import os
def extract_large_zip(archive_name, destination_directory):
with zipfile.ZipFile(archive_name, 'r') as zip_file:
for member in zip_file.infolist():
# Extract each member individually
zip_file.extract(member, destination_directory)
Java
Java์ `ZipInputStream` ๋ฐ `ZipOutputStream` ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆฌ๋ฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋์ฉ๋ ์์นด์ด๋ธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ๊ณต๋ ์ถ์ถ ์์ ๋ ์ด๋ฏธ ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ
Zipfile์ ๋ค๋ฅธ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ํ์ผ ์ด๋ฆ์ ์ ์ฅํ ์ ์์ต๋๋ค. ํ์ผ ์ด๋ฆ์ด ๋ค๋ฅธ ์์คํ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋๋ก ํ๋ ค๋ฉด ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ต์ zip ๋๊ตฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ด๋ฒ์ํ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ UTF-8 ์ธ์ฝ๋ฉ์ ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ zipfile์ CP437 ๋๋ GBK์ ๊ฐ์ ๋ ๊ฑฐ์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
zip ํ์ผ์ ๋ง๋ค ๋๋ ๊ฐ๋ฅํ ํ ํญ์ UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ํ์ผ์ ์ถ์ถํ ๋๋ ์ด์ ์์นด์ด๋ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ฝ๋ฉ์ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค.
Python
Python 3์ ๊ธฐ๋ณธ์ ์ผ๋ก UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์์นด์ด๋ธ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ์ธ์ฝ๋ฉ์ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ผ ํ ์ ์์ต๋๋ค. ์ธ์ฝ๋ฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ํ์ผ ์ด๋ฆ์ ๋์ฝ๋ฉํด ๋ณผ ์ ์์ต๋๋ค.
Java
Java๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์คํ ์ ๊ธฐ๋ณธ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. zip ํ์ผ์ ๋ง๋ค ๋๋ `Charset` ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ถ์ถํ ๋๋ ์ ์ ํ ๋ฌธ์ ์งํฉ ๊ตฌ์ฑ์ผ๋ก `InputStreamReader` ๋ฐ `OutputStreamWriter`๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ธ์ฝ๋ฉ์ ์ฒ๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค.
ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ
zipfile ์์นด์ด๋ธ๋ฅผ ์ฌ์ฉํ ๋๋ ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ์น์ ์์๋ ๋ค์ํ ์ด์ ์ฒด์ ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์์ ํธํ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ๋ค๋ฃน๋๋ค.
ํ์ผ ์ด๋ฆ ์ธ์ฝ๋ฉ
์์ ์ธ๊ธํ๋ฏ์ด ํ์ผ ์ด๋ฆ ์ธ์ฝ๋ฉ์ ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ ์ค์ํ ์์์ ๋๋ค. UTF-8์ ์ต์ zipfile์ ๊ถ์ฅ๋๋ ์ธ์ฝ๋ฉ์ด์ง๋ง ์ด์ ์์นด์ด๋ธ๋ ๋ ๊ฑฐ์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์นด์ด๋ธ๋ฅผ ๋ง๋ค ๋๋ ํญ์ UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ญ์์ค. ์ถ์ถํ ๋๋ ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ฝ๋ฉ์ ์ฒ๋ฆฌํ ์ค๋น๋ฅผ ํ์ญ์์ค.
๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ
๋ค๋ฅธ ์ด์ ์ฒด์ ๋ ๋ค๋ฅธ ๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ(์: Linux/macOS์ ๊ฒฝ์ฐ /
, Windows์ ๊ฒฝ์ฐ \
)๋ฅผ ์ฌ์ฉํฉ๋๋ค. Zipfile์ ์ฌ๋์(/)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. zip ํ์ผ์ ๋ง๋ค ๋๋ ํญ์ ์ฌ๋์๋ฅผ ๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ๋ซํผ์์ ํธํ์ฑ์ ๋ณด์ฅํ์ญ์์ค.
์ค ๋
๋ค๋ฅธ ์ด์ ์ฒด์ ๋ ๋ค๋ฅธ ์ค ๋(์: Linux/macOS์ ๊ฒฝ์ฐ LF, Windows์ ๊ฒฝ์ฐ CRLF)์ ์ฌ์ฉํฉ๋๋ค. Zipfile์ ์ผ๋ฐ์ ์ผ๋ก ์์นด์ด๋ธ ๋ด์ ๊ฐ๋ณ ํ์ผ์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ค ๋์ ์ง์ ์ ์ฅํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ ์คํธ ํ์ผ์ ์์นด์ด๋ธํ๋ ๊ฒฝ์ฐ ํ์ผ์ด ๋ค๋ฅธ ์์คํ ์์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋๋๋ก ์ค ๋ ๋ณํ์ ๊ณ ๋ คํด์ผ ํ ์ ์์ต๋๋ค.
ํ์ผ ๊ถํ
Zipfile์ ํ์ผ ๊ถํ์ ์ ์ฅํ ์ ์์ง๋ง ์ด๋ฌํ ๊ถํ์ด ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ด์ ์ฒด์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. Windows์๋ Linux/macOS์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์คํ ๊ฐ๋ฅํ ๊ถํ์ ๊ฐ๋ ์ด ์์ต๋๋ค. ํน์ ๊ถํ์ด ์๋ ํ์ผ์ ์์นด์ด๋ธํ๋ ๊ฒฝ์ฐ ์์นด์ด๋ธ๊ฐ ๋ค๋ฅธ ์ด์ ์ฒด์ ์์ ์ถ์ถ๋ ๋ ์ด๋ฌํ ๊ถํ์ด ์ ์ง๋์ง ์์ ์ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
zipfile ์์นด์ด๋ธ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ณด์์ด ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค. ์ด ์น์ ์์๋ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ๊ณผ ์ด๋ฅผ ์ํํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
Zip ํญํ ๊ณต๊ฒฉ
zip ํญํ์ ์์ถ๋ ๋ฐ์ดํฐ์ ์์ด ์ ์ด ์ถ์ถ ์ ๋งค์ฐ ํฐ ํฌ๊ธฐ๋ก ํ์ฅ๋๋ ์ ์ฑ ์์นด์ด๋ธ์ ๋๋ค. ์ด๋ก ์ธํด ์์คํ ๋ฆฌ์์ค๊ฐ ์๋ชจ๋์ด ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
zip ํญํ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ค๋ฉด ์ถ์ถ ์ค์ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋์คํฌ ๊ณต๊ฐ์ ์์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ต๋ ํ์ผ ํฌ๊ธฐ ๋ฐ ์ด ์ถ์ถ ํฌ๊ธฐ ์ ํ์ ์ค์ ํฉ๋๋ค.
๊ฒฝ๋ก ์ํ ์ทจ์ฝ์
๊ฒฝ๋ก ์ํ ์ทจ์ฝ์ ์ zipfile์ ๋๋ ํ ๋ฆฌ ์ํ ์ํ์ค(์: ../
)๊ฐ ํฌํจ๋ ํ์ผ ์ด๋ฆ์ด ์๋ ํญ๋ชฉ์ด ํฌํจ๋ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฒฉ์๋ ์๋ํ ์ถ์ถ ๋๋ ํ ๋ฆฌ ์ธ๋ถ์ ํ์ผ์ ๋ฎ์ด์ฐ๊ฑฐ๋ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฒฝ๋ก ์ํ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๋ ค๋ฉด zipfile ํญ๋ชฉ์ ํ์ผ ์ด๋ฆ์ ์ถ์ถํ๊ธฐ ์ ์ ์ ์คํ๊ฒ ํ์ธํ์ญ์์ค. ๋๋ ํ ๋ฆฌ ์ํ ์ํ์ค๊ฐ ํฌํจ๋ ํ์ผ ์ด๋ฆ์ ๊ฑฐ๋ถํฉ๋๋ค.
๋ฉ์จ์ด ๋ฐฐํฌ
Zipfile์ ์ฌ์ฉํ์ฌ ๋ฉ์จ์ด๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค. zipfile์ ์ถ์ถํ๊ธฐ ์ ์ ๋ฐ์ด๋ฌ์ค ๋ฐ ๊ธฐํ ์ ์ฑ ์ํํธ์จ์ด์ ๋ํด ๊ฒ์ฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ฝํ ์ํธํ
์์ ์ธ๊ธํ๋ฏ์ด ZipCrypto ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฝํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ค์ํ ๋ฐ์ดํฐ์ ์์กดํ์ง ๋ง์ญ์์ค. ๊ฐ๋ ฅํ ๋ณด์์ ์ํด ๋ ๊ฐ๋ ฅํ ์ํธํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ญ์์ค.
๊ฒฐ๋ก
Zipfile ์์นด์ด๋ธ๋ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ถ, ๋ฒ๋ค๋ง ๋ฐ ๋ฐฐํฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ๋ค์ํ ๋๊ตฌ์ ๋๋ค. ์์ฑ ๋ฐ ์ถ์ถ ํ๋ก์ธ์ค๋ ๋ฌผ๋ก ๊ณ ๊ธ ๊ธฐ์ ๊ณผ ๋ณด์ ๊ณ ๋ ค ์ฌํญ์ ์ดํดํจ์ผ๋ก์จ ๋ค์ํ ํ๋ซํผ์์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ณดํธํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์, ์์คํ ๊ด๋ฆฌ์ ๋๋ ๋ฐ์ดํฐ ๊ณผํ์์ด๋ zipfile ์์นด์ด๋ธ ์ฒ๋ฆฌ ๋ง์คํฐ๋ง์ ์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ํ์์ ์ธ ๊ธฐ์ ์ ๋๋ค.