
fs.appendFile
에 행을 추가하는 node.js 프로세스가 있습니다 . 예를 들어 및 2개의 호출 대신에 file.log
각각 약 40자의 전체 행을 추가합니다 . 이 파일을 다음 위치로 옮기면 줄이 손실되거나 부분적으로 복사되지 않도록 할 수 있나요?fs.appendFile("start-end")
fs.appendFile("start-")
fs.appendFile("end")
file2.log
답변1
파일 시스템 경계를 넘어 파일을 이동하지 않는 한 작업은 안전합니다. 이는 "이동"이 실제로 수행되는 방식인 역학 때문입니다.
파일이 동일한 파일 시스템에 있는 경우 mv
파일은 실제로 건드리지 않고 파일 시스템 항목만 변경됩니다.
$ mv foo bar
실제로는 다음과 같은 작업을 수행합니다.
$ ln foo bar
$ rm foo
이렇게 하면딱딱한파일(실제로 파일 시스템 항목이 가리키는 inode)에 대한 링크(두 번째 디렉토리 항목)의 foo
이름이 지정되고 bar
항목 foo
이 삭제됩니다. 이제 삭제 시 inode를 foo
가리키는 두 번째 파일 시스템 항목이 있으므로 foo
이전 항목을 삭제해도 foo
실제로 해당 inode에 속한 블록은 삭제되지 않습니다.
열린 파일 핸들이 파일 시스템 항목이 아닌 파일의 inode를 가리키기 때문에 프로그램은 어쨌든 파일에 행복하게 추가됩니다.
노트:프로그램이 쓰기 사이에 파일을 닫았다가 다시 열면 다음과 같은 오류가 발생합니다.새로운이전 파일 시스템 항목을 사용하여 파일이 생성되었습니다!
파일 시스템 간 이동:
파일 시스템 경계를 넘어 파일을 이동하면 상황이 나빠질 수 있습니다. 이 경우 mv
실제로 는 파일의 일관성이 보장되지 않습니다.
- 대상 파일 시스템에 새 파일을 생성합니다.
- 이전 파일의 내용을 새 파일에 복사합니다.
- 오래된 파일 삭제
또는
$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo
각기.
$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo
응용 프로그램에 쓰는 동안 복사본이 파일 끝에 도달했는지 여부에 따라 새 파일에는 줄이 절반만 있을 수 있습니다.
또한 응용 프로그램이 이전 파일을 닫았다가 다시 열지 않으면 이전 파일이 삭제된 것처럼 보이더라도 계속해서 이전 파일에 씁니다. 커널은 어떤 파일이 열려 있는지 알고 있으며 파일 시스템 항목을 삭제하더라도 삭제됩니다. 그것 . 이전 파일의 inode 및 관련 블록은 애플리케이션이 열린 파일 핸들을 닫을 때까지 삭제되지 않습니다.
답변2
node.js를 사용한다고 하셨으니 다음을 사용하실 거라고 가정하겠습니다.fs.rename()
(또는 fs.renameSync()
) 파일 이름을 바꿉니다. 이 node.js 메소드는 다음을 사용하도록 문서화되어 있습니다.이름 바꾸기(2)어떤 방식으로든 파일 자체를 건드리지 않고 단순히 파일 시스템에 나열된 이름을 변경하는 시스템 호출:
"이름을 바꿔라() 파일 이름을 바꾸고 필요에 따라 디렉터리 간에 이동합니다. 파일에 대한 기타 하드 링크(다음을 사용하여 생성됨)협회(2))에는 영향을 미치지 않습니다. 열린 파일 설명자오래된 길영향을 받지도 않습니다. "
위에 인용된 마지막 문장에 특별한 주의를 기울이십시오. 열려 있는 파일 설명자(예: 프로그램이 파일에 쓰는 데 사용하는 설명)는 이름을 바꾼 후에도 계속해서 이를 가리킬 것이라고 말합니다. 따라서 파일을 쓰는 동안 파일 이름을 바꾸더라도 데이터 손실이나 손상이 발생하지 않습니다.
Andreas Weise가 쓴 것처럼그의 대답, rename(2) 시스템 호출(따라서 fs.rename()
Node.js에서)은 파일 시스템 경계를 넘어 작동하지 않습니다. 따라서 이러한 방식으로 파일을 다른 파일 시스템으로 이동하려는 시도는 실패합니다.
유닉스mv
명령은 오류를 감지하고 대신 내용을 새 파일에 복사하고 원본 파일을 삭제하여 파일을 이동함으로써 이 제한을 숨기려고 합니다. 안타깝게도 이와 같은 파일을 이동하는 것은하다파일을 쓰는 동안 파일을 이동하면 데이터가 손실될 위험이 있습니다. 따라서 동시에 쓸 수 있는 파일의 이름을 안전하게 바꾸려면 다음을 수행해야 합니다.아니요사용하십시오 mv
(또는 적어도 새 경로와 이전 경로가 동일한 파일 시스템에 있는지 확인해야 합니다).