import os
import json# 配置参数BATCH_SIZE = 100 # 每批处理的文件数量CHECKPOINT_FILE = 'checkpoint.json’ERROR_LOG_FILE = ‘error_log.json’ # 记录失败文件名的日志文件SOURCE_FOLDER = ‘path/to/your/folder’ # 替换为你的文件夹路径def process_file(file_path): “”" 在这里放置你对单个文件的处理逻辑。 例如:压缩文件、转换格式等。 “”" print(f"Processing file: {file_path}") # 模拟文件处理可能会失败的情况 if not os.path.exists(file_path): raise FileNotFoundError(f"{file_path} does not exist")def read_checkpoint(): “”“读取检查点文件,返回开始处理的索引”"" if not os.path.exists(CHECKPOINT_FILE): return {‘index’: 0, ‘failed_files’: []} with open(CHECKPOINT_FILE, ‘r’) as f: checkpoint_data = json.load(f) return checkpoint_datadef write_checkpoint(index, failed_files): “”“写入检查点文件,记录下一批开始的位置和失败文件列表”"" with open(CHECKPOINT_FILE, ‘w’) as f: json.dump({‘index’: index, ‘failed_files’: failed_files}, f)def log_failed_files(failed_files): “”“记录失败文件到日志文件”"" with open(ERROR_LOG_FILE, ‘w’) as f: json.dump(failed_files, f, indent=4)def main(): # 获取文件列表并排序以确保每次运行时顺序一致 files = sorted([os.path.join(SOURCE_FOLDER, f) for f in os.listdir(SOURCE_FOLDER) if os.path.isfile(os.path.join(SOURCE_FOLDER, f))]) checkpoint_data = read_checkpoint() start_from_index = checkpoint_data[‘index’] failed_files = checkpoint_data.get(‘failed_files’, []) for i, file_path in enumerate(files[start_from_index:], start=start_from_index): try: process_file(file_path) # 如果处理完一批或者到达最后一个文件,则更新检查点 if (i + 1) % BATCH_SIZE == 0 or i == len(files) - 1: write_checkpoint(i + 1, failed_files) print(f"Batch completed. Next batch will start from index: {i + 1}") except Exception as e: print(f"Error processing file: {file_path}") print(e) failed_files.append({ ‘file’: file_path, ‘error’: str(e) }) # 继续处理其他文件 # 最后一次更新检查点(确保包括最后一批文件) write_checkpoint(len(files), failed_files) log_failed_files(failed_files) print(“All batches processed. Failed files logged.”)if name == “main”: main()
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 FolderToZip {
private static final int BUFFER_SIZE = 4096;
public static void main(String[] args) {
// 文件夹路径和输出ZIP文件路径
String sourceFolder = "path/to/your/folder"; // 替换为你的文件夹路径
String outputZipFile = "path/to/your/output.zip"; // 替换为你的输出ZIP文件路径
File directory = new File(sourceFolder);
File[] files = directory.listFiles();
try (FileOutputStream fos = new FileOutputStream(outputZipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
if (files != null) {
for (File file : files) {
if (!file.isDirectory()) { // 确保只添加文件而不是子目录
addToZip(directory, file, zos);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void addToZip(File rootPath, File fileToAdd, ZipOutputStream zos) throws IOException {
try (FileInputStream fis = new FileInputStream(fileToAdd)) {
// 创建ZIP条目并将其添加到输出流
String zipEntryName = fileToAdd.getPath().replace(rootPath.getPath(), "");
ZipEntry zipEntry = new ZipEntry(zipEntryName.startsWith("/") ? zipEntryName.substring(1) : zipEntryName);
zos.putNextEntry(zipEntry);
// 将数据写入ZIP条目
byte[] buffer = new byte[BUFFER_SIZE];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
}
}
}