전에 하이텔에 올렸던 소스입니다. 인터넷에 올라온 동영상 파일들을 보면
xxx.001, xxx.002 이렇게 이름 붙은 것들이 있죠? rzsplit라는 유틸리티로
분할한 것으로 rzjoin 유틸리티로 합칠 수 있습니다.
리눅스에서 어떻게 이런 파일을 합쳐볼려구 제가 어찌어찌 만들어 봤습니
다. 소스는 허접하지만, 지금까지 문제없이 잘 동작하네요. 어쩌다 윈도우즈
에서는 잘 join이 안되는 파일도 이걸로는 잘 합쳐집니다.
-- 신기하다 --;;
아래는 소스입니다. 유닉스에서 cc -o rzjoin rzjoin.c 하면 컴팔됩니다.
사용법은 rzjoin xxx.001 입니다.
/*
* Made by Jung, Doyou(벌레잡이) <doyou89 at kornet.net>
* 2001.06.17
*
* Join the split files by rzsplit.
*/
#include <stdio.h>
/* The return value of functions */
#define SUCCESS 1
#define FAIL 0
/* The maximum header size to be read by RZjoin */
#define MAX_HEADER_SIZE 100
#define MAX_BUFFER_SIZE 102400
/* tag */
#define END_OF_HEADER 0x2F
#define SPACE 0x20
/*#define DEBUG*/
int RZ_openFile(char *p_sFileName, FILE **fp, char *p_sHeader)
{
int iRet;
*fp = fopen (p_sFileName, "r");
if ( *fp == NULL)
return FAIL;
/* read header from the file */
iRet = fread (p_sHeader, MAX_HEADER_SIZE, 1, *fp);
if ( iRet == 0) {
fclose (*fp);
return FAIL;
}
return SUCCESS;
}
int RZ_openResultFile(char *p_sFileName, FILE **fp)
{
*fp = fopen (p_sFileName, "w");
if ( *fp == NULL)
return FAIL;
return SUCCESS;
}
int RZ_getResultFileName_Size(int *p_iByteRead, char
*p_sResultFileName, int *p_iResultFileSize, char *p_sHeader)
{
int iByteRead, i;
char sFileSize[21];
iByteRead = 0;
#ifdef DEBUG
printf ("Get the output filename.");
#endif
/* read the result file name */
while ( *p_sHeader != END_OF_HEADER ) {
/* 3 consecutive spaces means end of filename. */
if ( *p_sHeader == SPACE &&
*(p_sHeader+1) == SPACE &&
*(p_sHeader+2) == SPACE )
break;
*p_sResultFileName++ = *p_sHeader++;
iByteRead++;
}
#ifdef DEBUG
printf ("put ending mark & skip the spaces.");
#endif
/* if there is no filename, it's error. */
if ( iByteRead == 0 || *p_sHeader == END_OF_HEADER )
return FAIL;
/* put ending mark */
*p_sResultFileName = 0;
#ifdef DEBUG
printf ("The output filename is %s.", p_sResultFileName);
#endif
/* skip the spaces */
while ( *p_sHeader == SPACE ) {
p_sHeader++;
iByteRead++;
}
#ifdef DEBUG
printf ("Get the size of the output file.");
#endif
i = 0;
/* read the result file size */
#ifdef DEBUG
printf ("header : %d.", *p_sHeader);
#endif
while ( *p_sHeader != END_OF_HEADER ) {
#ifdef DEBUG
printf ("header : %d.", *p_sHeader);
#endif
sFileSize[i++] = *p_sHeader++;
iByteRead++;
}
sFileSize[i] = 0; /* put ending mark */
#ifdef DEBUG
printf ("convert filesize string to integer.");
#endif
/* convert filesize string to integer. */
*p_iResultFileSize = atoi(sFileSize);
if ( *p_iResultFileSize == 0 ) {
#ifdef DEBUG
printf ("file size is %s.", sFileSize);
#endif
return FAIL;
}
#ifdef DEBUG
printf ("Get the start point of the result file.");
#endif
/* set the start point of the result file */
*p_iByteRead = iByteRead + 1;
return SUCCESS;
}
int RZ_getNextFile(char *p_sFileName, FILE **fp)
{
int iLen;
char *p_ptr;
iLen = strlen (p_sFileName);
p_ptr = p_sFileName + iLen - 1;
if ( *p_ptr < '9' )
*p_ptr += 1;
else {
*p_ptr = '0';
if ( *(p_ptr-1) < '9' )
*(p_ptr-1) += 1;
else {
*(p_ptr-1) = '0';
if ( *(p_ptr-2) < '9' )
*(p_ptr-2) += 1;
else
return FAIL;
}
}
*fp = fopen (p_sFileName, "r");
if ( *fp == NULL) {
#ifdef DEBUG
printf ("file, %s do not exists.", p_sFileName);
#endif
return FAIL;
}
printf ("Read %s", p_sFileName);
return SUCCESS;
}
int RZ_joining(int iByteRead, int iResultFileSize, char *p_sFileName,
char *p_sResultFileName)
{
char sBuffer[MAX_BUFFER_SIZE+1];
int iRet, iReadSize;
int iTotalWrite;
FILE *fp, *fpOut;
/* open result file to be joined. */
if ( !RZ_openResultFile (p_sResultFileName, &fpOut) ) {
printf ("Error in opening file, %s.", p_sResultFileName);
return FAIL;
}
/* Initialize filename */
p_sFileName[strlen(p_sFileName)-1] = '0';
RZ_getNextFile (p_sFileName, &fp);
/* read out the header scope. */
fread (sBuffer, iByteRead, 1, fp);
iTotalWrite = 0;
do {
/* do the file copy */
while ( (iReadSize = fread (sBuffer, 1, MAX_BUFFER_SIZE, fp)) !
= 0 ) {
iRet = fwrite (sBuffer, iReadSize, 1, fpOut);
iTotalWrite += iReadSize;
if ( iRet == 0 ) {
printf ("Error in writing the result file.");
return FAIL;
}
}
fclose (fp);
iRet = RZ_getNextFile (p_sFileName, &fp);
#ifdef DEBUG
printf ("The result of RZ_getNextFile() is %d.", iRet);
#endif
} while ( iRet ) ;
if ( iTotalWrite != iResultFileSize ) {
printf ("Differ in file size!!!");
printf ("Expected file size : %d, real writing size : %d",
iResultFileSize, iTotalWrite);
return FAIL;
}
/*fclose (fp);*/
fclose (fpOut);
return SUCCESS;
}
main(int argv, char *argc<>)
{
char sFileName[256];
int iByteRead;
char sResultFileName[256];
int iResultFileSize;
char sHeader[MAX_HEADER_SIZE+1];
FILE *fp;
if ( argv < 2 ) {
printf ("");
printf ("Author : Jung, Doyou(벌레잡이)
<doyou89 at kornet.net>");
printf (" made at 19 Jun, 2001.");
printf ("");
printf ("USAGE : rzjoin <file-to-be-joined>");
printf ("");
exit (0);
}
strcpy (sFileName, argc[1]);
#ifdef DEBUG
printf ("file, %s will be open.", sFileName);
#endif
/* open the source file to be joined. */
if ( !RZ_openFile (sFileName, &fp, sHeader) ) {
printf ("Error in opening file, %s.", sFileName);
exit (1);
}
#ifdef DEBUG
printf ("file, %s opened.", sFileName);
#endif
/* get the result filename and size */
if ( !RZ_getResultFileName_Size (&iByteRead, sResultFileName,
&iResultFileSize, sHeader) ) {
printf ("Could not get the result filename and size.");
exit (1);
}
fclose (fp);
printf ("");
printf ("result file name : %s",sResultFileName);
printf ("result file size : %i",iResultFileSize);
printf ("");
/* start joining */
if ( !RZ_joining (iByteRead, iResultFileSize, sFileName,
sResultFileName) ) {
printf ("Error in joining file, %s.", sResultFileName);
exit (1);
}
printf ("");
printf ("rzjoin complete..");
}--O.O
|____