2012-08-31 5 views
0

다른 파일을 사용하지 않고도 파일의 일부분을 삭제할 수 있습니까 (처음부터 반까지).다른 파일을 사용하지 않고 파일을 자르는 방법?

감사합니다.

+0

RAM을 사용 하시겠습니까? 나는 구멍 파일 0.5 개를 메모리에 읽고, 삭제하고, 다시 읽은 데이터 0.5 개를 쓸 수 있었다. –

+1

나는 그것이 OP가 피하려고하는 것이라고 생각합니다. – jrok

+1

짧은 대답 : 아니요, (적어도 대부분의) 파일 시스템은이를 지원하지 않습니다. 당신이 할 수있는 일은 당신이 원하지 않는 부분을 남겨 놓는 (동일하거나 다른 파일에) 복사본을 만드는 것입니다. –

답변

2

간단히 말해서, 대부분의 파일 시스템은 그런 작업을 지원하지 않습니다.

두 가지 선택 사항이 있습니다. 분명한 것은 데이터의 복사본을 만들어 원하지 않는 부분을 남기지 않는 것입니다. 현재 위치에서 (즉, 같은 파일에서 데이터를 이동하는 등) 또는 보조 파일을 사용하여 데이터를 새 파일로 복사 한 다음 새 파일의 이름을 이전 이름으로 바꾸는 것과 같은 작업을 수행 할 수 있습니다.

다른 주요 선택은 단순히 파일과 데이터를 재구성하여 이전 데이터를 전혀 제거 할 필요가 없도록하는 것입니다. 예를 들어 프로세스에서 가장 최근 N 개의 데이터 양을 유지하려는 경우 파일의 대부분을 원형 버퍼로 구조화 할 수 있습니다. 처음에는 몇 개의 "포인터"를 사용하여 헤드 및 테일 포인트를 알려줍니다 , 데이터를 읽고 쓰는 위치를 알 수 있습니다. 이와 같은 구조에서는 이전 데이터를 지우거나 제거하지 않고 필요에 따라 덮어 씁니다.

1

메모리가 충분하면 내용을 메모리로 완전히 읽고 파일 앞쪽으로 다시 복사 한 다음 파일을 자릅니다.

메모리가 충분하지 않은 경우 파일을 자르면 블록으로 복사하십시오.

+0

하지만 파일이 너무 커서 메모리에 복사 할 수 없을 수도 있습니다. 차단 시간이 오래 걸릴 수도 있습니다. –

+0

블록 메모리를 읽을 때 메모리는 문제가되지 않습니다. 시간 문제는 메모리가 아니라 I/O입니다. 파일이 클수록 프로세스가 길어집니다. – Grzegorz

3

예, 가능하지만 여전히 대부분의 파일을 다시 작성해야합니다.

open the file 
beg = find the start of the fragment to be removed 
len = length of the fragment to be removed 
blocksize = 4096 -- example block size, may be any 
datamoved = 0 
do { 
    fseek(pos +len +datamoved); 
    if(endoffile) return; -- finished! 
    actualread = fread(buffer, blocksize) 
    fseek(pos + datamoved) 
    fwrite(buffer, actualread) 
    datamoved += actualread 
} 

를 루프 후, 마지막 단계는 '잘라 내기'는 POS + datamoved 크기로 파일입니다 다음과 같이

거친 좋습니다. 기본 파일 시스템이 'truncatefile'작업을 처리하지 않으면 다시 작성해야하지만 .. 대부분의 파일 시스템과 라이브러리가이를 지원합니다.

+1

참고 : 기존의 HDD 또는 Floppys 또는 ZIP 드라이브 등에서 파일 조각을 삭제하면 파일을 새 파일로 다시 쓰는 것보다 속도가 훨씬 느릴 수 있습니다. 왜냐하면 탐색을 다시 시도하면 드라이브 헤드가 잘 움직일 수 있기 때문입니다. 5 월이지만 그렇게 할 필요는 없습니다. 또한 특정 파일 시스템에 코드를 바인딩 할 수있는 경우 파일 중간에서 BLOCK/INODE를 실제로 삽입/재정렬/제거 할 수있는 저수준 작업을 발견 할 수 있습니다. 그런 다음 적은 양의 데이터 만 이동하면됩니다 ,하지만 그건 꽤 복잡한 일입니다 .. – quetzalcoatl

관련 문제