해당 파일을 length길이로 자르는 거구요.
length가 파일 크기보다 작은 경우, 파일 처음부터 length만큼 자르고 그 이후 데이터는 전부 버리고, 파일을 생성합니다. length가 파일 보다 큰경우, 원래 파일에 length - filesize 만큼을 0으로 채워 파일을 만든다고
메뉴얼 페이지에
나와있습니다.
Do you think that's the air you are breathing now?
DESCRIPTION
The truncate() system call causes the file named by path or referenced by
fd to be truncated or extended to length bytes in size. If the file was
larger than this size, the extra data is lost. If the file was smaller
than this size, it will be extended as if by writing bytes with the value
zero. With ftruncate(), the file must be open for writing.
추가합니다. POSIX에서는 늘어나고 0으로 채워져야 한다고 이야기하고 있네요.
47459-47460행입니다.
47456 DESCRIPTION
47457 The truncate( ) function shall cause the regular file named by path to have a size which shall be
47458 equal to length bytes.
47459 If the file previously was larger than length, the extra data is discarded. If the file was previously
47460 shorter than length, its size is increased, and the extended area appears as if it were zero-filled.
47461 The application shall ensure that the process has write permission for the file.
47462 If the request would cause the file size to exceed the soft file size limit for the process, the
47463 request shall fail and the implementation shall generate the SIGXFSZ signal for the process.
47464 This function shall not modify the file offset for any open file descriptions associated with the
47465 file. Upon successful completion, if the file size is changed, this function shall mark for update
47466 the st_ctime and st_mtime fields of the file, and the S_ISUID and S_ISGID bits of the file mode
47467 may be cleared.
참고로 ftruncate()는 0으로 채운 것처럼 늘어나거나, error를 돌려줘야 한다고 되어 있더군요.
한줄이라는 의미는 텍스트 파일의 경우에 한하는 게 아닐까요?
한줄이라는 의미는 텍스트 파일의 경우에 한하는 게 아닐까요?
-----
http://monpetit.posterous.com/
http://monpetit.tistory.com/
저도 참...
바이너리 파일???
항상 깨어있어라 ~~~
[quote="monpetit"]한줄이라는 의미는 텍스트 파일의 경우에
그렇담.. 말을 바꾸어서.
특정 바이트에 직접 접근해서 몇바이트만 삭제할수 있는 방법은 없나요???
여러 다른 방법이 있을지 모르겠지만 당장 생각나는 것은, 파일이 자료구조
여러 다른 방법이 있을지 모르겠지만 당장 생각나는 것은, 파일이 자료구조로 되어 있는 게 아니라면, 즉 스트림이라면 파일을 열어서 처음부터 끝까지 읽어가면서 삭제하고 싶은 부분만 건너뛰면 될 것 같은데요...
예를 들면
1. 파일 A를 열고 (읽기)
2. 파일 B를 열고 (쓰기)
3. 파일 A에서 바이트를 읽어 B에 복사하면서
4. 삭제하고 싶은 부분을 건너뛰면
원하는 내용이 B에 들어가지 않겠습니까. :wink:
-----
http://monpetit.posterous.com/
http://monpetit.tistory.com/
inode를 유지하시렵니까? 아니면 이름만 새로이 작성되길 원하십니까..
inode를 유지하시렵니까? 아니면 이름만 새로이 작성되길 원하십니까..
inode를 유지하려면, block 단위로 읽고 버퍼에서 쉬프트를 한다음 저장하는 방법을 사용해야겠군요.
그리고 맨 마지막에는 truncate 함수 한번 사용해야하구요.
---
http://coolengineer.com
답변 정말 감사합니다...^^방법이 있군요..역시 허접한 저의 실
답변 정말 감사합니다...^^
방법이 있군요..역시 허접한 저의 실력에 고개가 숙연해집니다..
여기서 많이 배우고 있긴하지만..
그래도 역시 초보라서..
고수님들의 말을 듣고도 감이 좀 안 잡히거든요..
truncate함수를 어떻게 사용하는지도 잘 모르겠거든요.
죄송하지만.. 좀 더 구체적으로 설명부탁드릴께요...^^
음, inode를 유지한다는 것은, 같은 파일의 내용을 편집하는 것이고,
음, inode를 유지한다는 것은, 같은 파일의 내용을 편집하는 것이고, 유지하지 않는 다는 것은, 다른 파일로 원하는 부분만 복사한뒤 원본을 삭제하고 원본과 이름을 같도록 만드는 것입니다. 이것이 쉽죠. (temporary 파일만 충분하면요.)
truncate함수는 단지 파일의 크기를 그만큼으로 줄이는 일을 합니다. 중간을 삭제하려고 뒷부분을 앞으로 끌어당기면 뒤는 잘라야하지 않습니까..?
truncate함수의 정의되지 않은 기능중의 하나는 원래 길이보다 길게 잘랐을때 파일 크기가 늘어나느냐는 것인데, 주의하여 사용하세요.
---
http://coolengineer.com
로직과, API가 알려졌다면, 나머지는 헤더 파일과 메뉴얼 페이지 보기네
로직과, API가 알려졌다면, 나머지는 헤더 파일과 메뉴얼 페이지 보기네요.
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
해당 파일을 length길이로 자르는 거구요.
length가 파일 크기보다 작은 경우, 파일 처음부터 length만큼 자르고 그 이후 데이터는 전부 버리고, 파일을 생성합니다. length가 파일 보다 큰경우, 원래 파일에 length - filesize 만큼을 0으로 채워 파일을 만든다고
메뉴얼 페이지에
나와있습니다.
Do you think that's the air you are breathing now?
매뉴얼은, 파일을 원본보다 더 크게 자른다(?)고 할 때, 정의되어 있지
매뉴얼은, 파일을 원본보다 더 크게 자른다(?)고 할 때, 정의되어 있지 않다고 나와있으며,
정의되지 않은 행동은 그대로이거나 늘어나거나 인데, 늘어날 경우는 0으로 채워서 늘어난다입니다.
아뭏든 정의되어 있지 않은데, 제가 확인한 Linux, Solaris, AIX, HPUX에서는 모두 늘어납니다 :)
---
http://coolengineer.com
저 행동이... OS 일지, File System일지는 생각해보지는 않았
저 행동이... OS 일지, File System일지는 생각해보지는 않았습니다. File System 행동이겠죠?
---
http://coolengineer.com
리눅스에서는 0으로 채워지는데요...테스트 해봤습니다.페도
리눅스에서는 0으로 채워지는데요...
테스트 해봤습니다.
페도라 코어 1.0에서 물론 os설치시 같이 설치된 라이브러리를 사용했구요.
다른 플랫폼에서는 테스트 못해봤습니다.
Do you think that's the air you are breathing now?
[quote="운형"]리눅스에서는 0으로 채워지는데요...테스트
FreeBSD 5.2-current 입니다. 역시 0으로 채워서 늘어나네요.
추가합니다. POSIX에서는 늘어나고 0으로 채워져야 한다고 이야기하고 있네요.
47459-47460행입니다.
참고로 ftruncate()는 0으로 채운 것처럼 늘어나거나, error를 돌려줘야 한다고 되어 있더군요.
----
Let's shut up and code.
댓글 달기