2012-12-02 2 views
4

C에서 파일의 시작 부분에서 N 바이트를 삭제할 수 있습니까?C에서 파일의 시작 부분에서 N 바이트를 삭제할 수 있습니까?

N은 30 바이트입니다. 그들은 (심지어 가끔의 GBS 100) 매우 크기 때문에

난 당신이 다른 파일 내에서의 오프셋 (offset)를 가리키는 루프백 디바이스를 만들 수 있습니다 리눅스

+1

C가이 작업을 수행하지만 알 수없는 파일 시스템과 운영 체제가 (대부분) 내부 수정 또는 변경을 지원하면 올바른 질문이 아닙니다. 그들이하는 경우, C는 그 사실을 이용할 수있는 많은 langauges 중에서 가장 투명한 것 중 하나입니다. 그렇지 않으면 프로그래밍 언어가 없습니다. –

+0

그리고 그 대답은 거의 확실합니다. 나는 이것을 할 수있는 OS가 없다는 것을 안다. –

+0

바이트 30 이후의 파일 내용을 begin으로 이동하고 POSIX 시스템에서는 truncate로, Windows 시스템에서는 _chsize로 파일을자를 수 있습니다. – user411313

답변

2

을 파일을 복사 할 수 없습니다. unix.stackexchange에서 Here is such an example :

#!/bin/bash 
for ((i=0;i<10000;i++)); do 
    printf "%7d\n" $i 
done >/var/tmp/file 
losetup -v -f -o 512 --sizelimit 512 /var/tmp/file 
losetup -a 
head -2 /var/tmp/file 
echo ... 
tail -2 /var/tmp/file 
echo === 
head -2 /dev/loop0 
echo ... 
tail -2 /dev/loop0 
printf "I was here" > /dev/loop0 
grep here /var/tmp/file 
losetup -d /dev/loop0 

출력 :

loop device: /dev/loop0 
/dev/loop0: [0808]:136392 (/var/tmp/file), offset 512, size 512 
     0 
     1 
... 
    9998 
    9999 
=== 
    64 
    65 
... 
    126 
    127 
I was here 65 
+0

스파 스 파일은 도움이되지 않습니다. –

+0

@R 필자의 솔루션을 업데이트했지만 스파 스 파일로 제거 할 수 있다고 확신한다. 파일을 두 개의 블록으로 분할하면 첫 번째 * 여하튼 *를 우회 할 수 있어야합니다. 나는 그 방법이 내 머리 꼭대기에서 벗어날 지 확신하지 못한다. –

+0

방법이 없으며 OP가 삭제하려는 양이 어쨌든 블록 크기의 배수가 아닙니다. –

1

당신은 파일의 시작 부분에서 30 바이트를 삭제할 수 없습니다, 그러나 아무것도 적어도 대부분에 (파일을 덮어 쓰는 것을 중지하지 유닉스 파일 시스템). 이는 소요되는 시간의 측면에서 복사본에 해당하지만 여유 디스크 공간을 모두 차지하지 않습니다.

내가 철저히 테스트하지는 않았지만 도움이 될만한 약간의 기능이 있습니다.

경고 : 예전에는 off_t이 32 비트 부호있는 정수 였기 때문에 2 바이트보다 큰 파일에는 pread, pwrite 및 ftruncate를 사용할 수 없었습니다. 리눅스에서는 더 이상 그렇지 않습니다. 그러나 pread64, pwrite64 및 ftruncate64를 사용해야 할 수도 있습니다. 실제로 당신의 OS에서 작동 하는지를 확인하기 전까지 정말로 큰 파일에서 이것을 시도하지 마십시오.

int fshift(int fd, off_t to, off_t from) { 
    if (from <= to) { 
    fprintf(stderr, "%s\n", "Unimplemented: fshift can only shift left"); 
    errno = ERANGE; 
    return -1; 
    } 
    char buffer[BUFFER_SIZE]; 
    for (;;) { 
    ssize_t n_read = pread(fd, buffer, BUFFER_SIZE, from); 
    if (n_read < 0) { 
     int tmp = errno; 
     perror("fshift: could not read file"); 
     errno = tmp; 
     return -1; 
    } 
    from += n_read; 
    if (n_read == 0) { 
     int rc = ftruncate(fd, to); 
     if (rc < 0) { 
     int tmp = errno; 
     perror("fshift: could not truncate file"); 
     errno = tmp; 
     } 
     return rc; 
    } 
    for (char* p = buffer, *lim = &buffer[n_read]; p < lim;) { 
     ssize_t n_write = pwrite(fd, p, lim - p, to); 
     if (n_write < 0) { 
     int tmp = errno; 
     perror("fshift: could not write file"); 
     errno = tmp; 
     return -1; 
     } 
     p += n_write; 
     to += n_write; 
    } 
    } 
} 
관련 문제