📄 dxzip.c
字号:
/* --------------------------------------------------------------------
DXZIP - This routine does for PKZIP and ZIP files what DXARC did for
ARC files: deletes files on the main directory already in
the ZIP file, either by name only or if size, date, and time
matches.
Compiler: Turbo C 1.5. Will compile under Turbo C 2.0 or under
MicroSoft C 5.0 or later or QuickC 2.0 or later.
Contributions are welcome...send to:
Edward V. Dong
12205 Alexandria Place
Chino, CA 91710
Comments may be directed to E.DONG on Diamond Bar BBS at 714-861-1549
(1200/2400/9600), "E.DONG" on GENIE, or 71641,2371 on CompuServ.
PKZIP is copyrighted by Phil Katz.
This routine is copyright (c) 1989 by Edward V. Dong, All Rights Reserved.
-------------------------------------------------------------------- */
#include <stdio.h>
#include <string.h>
#include <mem.h>
#include <dos.h>
#include <dir.h>
typedef long signature_type;
signature_type local_file_header_signature = 0x04034b50;
signature_type central_file_header_signature = 0x02014b50;
signature_type end_central_dir_signature = 0x06054b50;
int name = 0; /* default must be complete match */
int prompt = 0; /* default is no prompt */
int FilesKilled = 0; /* initialize to zero files killed */
int NoOfFiles = 0; /* initialize to zero files scanned */
typedef struct xyx
{ int version_needed_to_extract;
int general_purpose_bit_flag;
int compression_method;
int last_mod_file_time;
int last_mod_file_date;
long crc32;
long compressed_size;
long uncompressed_size;
int filename_length;
int extra_field_length;
} local_file_header;
typedef struct xyxx
{ int version_made_by;
int version_needed_to_extract;
int general_purpose_bit_flag;
int compression_method;
int last_mod_file_time;
int last_mod_file_date;
long crc32;
long compressed_size;
long uncompressed_size;
int filename_length;
int extra_field_length;
int file_comment_length;
int disk_number_start;
int internal_file_attributes;
long external_file_attributes;
long relative_offset_local_header;
} central_directory_file_header;
typedef struct xyx2
{ int number_this_disk;
int number_disk_with_start_central_directory;
int total_entries_central_dir_on_this_disk;
int total_entries_central_dir;
long size_central_directory;
long offset_start_central_directory;
int zipfile_comment_length;
} end_central_dir_record;
FILE* zipfile;
int killfile(char *filename,int date,int time,long filelen)
{ /* kill main files tagged in ZIP */
struct ffblk ffblk;
int Kill;
Kill = 0; /* don't kill file */
NoOfFiles++; /* increment number of files scanned */
if (!findfirst(filename,&ffblk,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCH))
{ if ( (date==ffblk.ff_fdate) &&
(time==ffblk.ff_ftime) &&
(filelen==ffblk.ff_fsize))
Kill = 1; /* match found */
if (prompt)
{ printf(" ?");
if (toupper(getch())!='Y') return;
Kill = 1; /* kill file */
}
if (name) Kill = 1; /* kill on name match */
if (Kill)
{ if (!unlink(filename))
{ printf("\t: Killed\n");
FilesKilled++;
}
else printf("\t: Can't Kill\n");
}
}
else printf(": Not Found\n");
}
void process_local_file_header(void)
{
local_file_header header;
char filename[240], extra[240];
int mon, day, year, hrs, min;
/* read local file header to get filename */
fread(&header,sizeof(local_file_header),1,zipfile);
setmem(filename,sizeof(filename),0);
fread(filename,header.filename_length,1,zipfile); /* get filename */
fread(extra,header.extra_field_length,1,zipfile);
fseek(zipfile,header.compressed_size,1); /* skip to next one */
/* list file name, date, time, size */
printf("%s",filename);
killfile(filename,header.last_mod_file_date,
header.last_mod_file_time,header.uncompressed_size);
}
void process_central_file_header(void)
{
central_directory_file_header header;
char filename[240], extra[240], comment[240];
/* open ZIP file & print optional comment if any */
fread(&header,sizeof(central_directory_file_header),1,zipfile);
fread(filename,header.filename_length,1,zipfile);
fread(extra,header.extra_field_length,1,zipfile);
setmem(comment,sizeof(comment),0);
fread(comment,header.file_comment_length,1,zipfile);
if (comment[0]) printf("%s\n",comment);
}
void process_end_central_dir(void)
{
end_central_dir_record record;
int count;
fread(&record,sizeof(end_central_dir_record),1,zipfile);
count = record.zipfile_comment_length;
while (count) /* bypass comments */
{ fgetc(zipfile);
count--;
}
}
void process_headers(void)
{
long sig;
while (1)
{ if (!fread(&sig,sizeof(long),1,zipfile))
{ printf("\nZIP file is truncated: aborting...");
exit(1);
}
if (sig == local_file_header_signature)
process_local_file_header();
else if (sig == central_file_header_signature)
process_central_file_header();
else if (sig == end_central_dir_signature)
{ process_end_central_dir();
printf("SUMMARY: %d (of %d) files killed\n",
FilesKilled,NoOfFiles);
return;
}
else
{ printf("\nZIP file has errors...aborting!\n");
exit(1);
}
}
}
main(int argc,char *argv[])
{
char filename[240];
int count;
argc--;argv++; /* skip zeroth argument */
printf("DXZIP 1.0 (c) 1989 by E.Dong (on GENIE) (CIS 71641,2371)\n");
if (argc)
{ strcpy(filename,argv[0]);
argc--;
if (argc)
{ count = strlen(strupr(argv[1]));
if (strncmp(argv[1],"NAME",count)==0)
name = 1;
else if (strncmp(argv[1],"PROMPT",count)==0)
prompt = 1;
}
if (strchr(filename,'.')==NULL) /* no extension given */
strcat(filename,".ZIP");/* add default extension */
zipfile = fopen(filename,"rb"); /* open file if possible */
if (zipfile == NULL) /* error on opening file */
{ printf("Unable to open file %s\n",filename);
exit(1);
}
else process_headers();
fclose(zipfile);
}
else
{ printf("Deletes file(s) in current directory found in ZIP file\n");
printf("Syntax: DXZIP zipfile [name|prompt]\n");
printf(" 'zipfile' is required\n");
printf(" 'name' deletes file on name match\n");
printf(" 'prompt' asks if to delete file\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -