[질문] 왜 파일이 수정이 안 될까요?
      글쓴이: naisr00t / 작성시간: 목, 2004/05/20 - 5:15오후    
  
  몇 일 째 고생입니다.
파일을 카피 후, 파일의 내용을 수정하려고 합니다.
그런데, 디버깅 때는, 수정한 내용이 보여서 완전히 수정되었다고 생각했습니다.
그런데, 실제로 파일을 열어보니, 그대로입니다.
소스파일을 첨부합니다.
아울러 소스의 내용은 다음과 같습니다.
개발환경은 VC++ 입니다. 수정해야 할 파일은 01.jar 파일입니다.
디렉토리 엔트리 부분에 OK 라고 시작되는 부분을 PK 라고 수정해야 되는 것인데...
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include "MHtypes.h"
#define PERMS 0666
#define BUFSIZE					512
#define SIZEOFCENTRALEND		22
#define CENTRALENDSIGNATURE     0x06054b50
/*
 * Macros for getting central directory header (CEN) fields
 */
#define CENHOW 10     /* compression method */
#define CENTIM 12     /* file modification time (DOS format) */
#define CENSIZ 20     /* compressed size */
#define CENLEN 24     /* uncompressed size */
#define CENNAM 28     /* length of filename */
#define CENEXT 30     /* length of extra field */
#define CENCOM 32     /* file comment length */
#define CENOFF 42     /* offset of local header */
#define CENHDRSIZ 46
#define READ16(ptr, pos)	(M_Int16)(*((M_Uint8*)ptr+pos) | (*((M_Uint8*)ptr+pos+1) << 8))
#define READ32(ptr, pos)	(M_Int32)(*((M_Uint8*)ptr+pos) | (*((M_Uint8*)ptr+pos+1) << 8) | (*((M_Uint8*)ptr+pos+2) << 16) | (*((M_Uint8*)ptr+pos+3) << 24))
//error print
void fatal(char *error_name)
{
    perror(error_name);
    exit(1);
}
int JarFile_getJarInfo(char* testFile1, char* testFile2, int* offset, 
					   int* compressed_size, int* uncompressd_size, int* compress_meth)
{
    char buf[SIZEOFCENTRALEND]; //SIZEOFCENTRALEND = 22
    char fileName[256];
    char* cBuf;
    int cDirSize;
	int cDirOff;
	int entryCount;
    int i;
	int res = 0;
	int fnLen;
	int fp;
	int fd;
	int cnt = 0;
	int srcFD, destFD;
	int readNumber;
	char buff[BUFSIZE];
  
    //MV_DECLARE_REWIND_VAR(rwnPos);
	//rewind(fd);
    if ((srcFD = _open(testFile1, _O_RDONLY | _O_BINARY)) < 0) {
        fatal("Read Opend\n");
    } 
    
	if ((destFD = _open(testFile2, _O_RDWR | _O_CREAT | _O_TRUNC | _O_BINARY, 0666)) < 0) {
        fatal("Write Opened\n");
    }
	
	while ((readNumber = _read(srcFD, buff, BUFSIZE)) > 0) {
        if (_write(destFD, buff, readNumber) < readNumber) {
			fatal("Success Writed");
		}
	}
    printf("%s close success - #%d\n", testFile1, _close(srcFD));
	fd = destFD;
    if ((fp = lseek(fd, -SIZEOFCENTRALEND, SEEK_END)) < 0 ) {
		return(-5);
    }
	res = _read(fd, buf, SIZEOFCENTRALEND);
    //readFD = read(fd, buf, SIZEOFCENTRALEND);
	       
    if (READ32(buf, 0) != CENTRALENDSIGNATURE ) {
        return(-6);
    }
    
    entryCount = READ16(buf, 10);
    cDirSize = READ32(buf, 12);
    cDirOff = READ32(buf, 16);
	//MV_MEM_SET_REWIND_POS(rwnPos);
	//lseek(fd, 0L, 0);
    lseek(fd, cDirOff, SEEK_SET);
	//cBuf = memCheckCalloc(cDirSize);
    cBuf = (char *)malloc(cDirSize);
    
	if (cBuf == 0) {
		printf("Out of Memory\n");
        return(-7); // outOfMemory
    }
	
	memset(cBuf,0x0,cDirSize);
    _read(fd, cBuf, cDirSize);
	/*
    if ((res = read(fd, cBuf, cDirSize)) != cDirSize) {
	    printf("res = %d\n", res);
        MV_MEM_REWIND(rwnPos);
        lseek(fd, 0L, 0);		//rewind
        return(-1);
    }
	*/
    for (i = 0; i < entryCount; i++) {
        *compress_meth = READ16(cBuf, CENHOW); //10
		*compressed_size = READ32(cBuf, CENSIZ); //22
        *uncompressd_size = READ32(cBuf, CENLEN); //24
        if ( *uncompressd_size != 0 ) {
            fnLen = READ16(cBuf, CENNAM);
            memcpy(fileName, cBuf+CENHDRSIZ, fnLen);
            fileName[fnLen] = 0;
            *offset = READ32(cBuf, CENOFF);
			
			/*			
            if (!strcmp(name,fileName)) {
			    //MV_MEM_REWIND(rwnPos);
                return(0);
            }
			*/
        }
        cBuf += CENHDRSIZ + READ16(cBuf, CENNAM) + READ16(cBuf, CENEXT) + READ16(cBuf, CENCOM);
	    
	    if (cBuf[0] == 'O' && cBuf[0 +1] == 'K') {
			cBuf[0] = 'P';	
			//cnt++;			
		    //printf("Bingo: count = %d\n", cnt);
		}		
    }
    //MV_MEM_REWIND(rwnPos);
	//lseek(fd, cDirOff, SEEK_SET);
    //버퍼에 바뀐 내용을 다시 쓰기 위해 파일 포인터를 다시 엔트리 부분에 놓는다.
	if ((fp = lseek(fd, -SIZEOFCENTRALEND, SEEK_END)) < 0 ) {
		return(-5);
    }
	
	res = _read(fd, buf, SIZEOFCENTRALEND);
   	       
    if (READ32(buf, 0) != CENTRALENDSIGNATURE ) {
        return(-6);
    }
    
    entryCount = READ16(buf, 10);
    cDirSize = READ32(buf, 12);
    cDirOff = READ32(buf, 16);
    lseek(fd, cDirOff, SEEK_SET);
	while ((readNumber = _read(destFD, cBuf, (int)cBuf)) > 0) {
        if (_write(destFD, cBuf, readNumber) < readNumber) {
			fatal("Success Writed");
		}
	}
    printf("%s close success - #%d\n", testFile2, _close(fd));
	return (1);
}
//copy program TEST
int main(int argc, char* argv[])
{    
    int srcFD = 0;
	int destFD = 0;
	int fd = 0;
    int readNumber = 0;
	int offset = 0;
	int compressed_size = 0;
	int uncompressd_size = 0;
	int compress_meth = 0;
	int res = 0;
    //char buff[BUFSIZE];
    void fatal(char*);
	//Test File;
	char* testFile1 = "01.jar";
	char* testFile2 = "02.jar";
    ///*
	if (argc < 2) {
        printf("Usage: Command file1.jar file2.jar\n");
	    exit(0);
    }
	//*/
    
#ifdef WIN32
	
	printf("Compiling ..... [WIN32]\n");
#endif
	//test
	//res = JarFile_getJarInfo(testFile1, testFile2, &offset, &compressed_size, &uncompressd_size, &compress_meth);
	res = JarFile_getJarInfo(argv[1], argv[2], &offset, &compressed_size, &uncompressd_size, &compress_meth);
	
	if (1 == res) {
	    printf("Copy Completed: Conversion Success\n", res);
	} else {
	    printf("check number - #%d\n", res);
	}
    return(0);
}
File attachments: 
| 첨부 | 파일 크기 | 
|---|---|
|  convertJar.zip | 411.81 KB | 
Forums: 


* 참고1) man lseek2) lseek()예제를 많이 본다.
* 참고
1) man lseek
2) lseek()예제를 많이 본다.
3) 테스트도 해본다
4) 또해본다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기