2015-01-01 3 views

답변

3

실제로 파일을 동 기적으로 또는 비동기 적으로 액세스하는지 여부는 중요하지 않습니다. 사용자가 독서 중일 때 다른 프로세스 (사용자 또는 다른 사람)가 파일을 수정하면 일치하지 않는 결과가 발생합니다.

표시되는 불일치의 종류는 파일 작성 방법 및 읽기 시작 시점에 따라 다릅니다.

노드의 기본값 인 mode (w)에서 파일의 기존 내용은 파일을 열 때 잘립니다.

  • 기내에서의 읽기는 오류없이 완료 될 때까지 일찍 중단됩니다. 즉, 원래 파일의 일정 비율 만 차지합니다.
  • 쓰기가 시작된 후 시작된 읽기는 마지막으로 기록 된 바이트까지 읽습니다. 쓰기가 얼마나 빠르거나 빠르며, 파일을 읽는 방법에 따라 읽기는 전체 파일을 보거나 보지 못할 수도 있습니다.

r+ 모드로 파일을 쓰는 경우 파일을 쓰기 위해 열 때 내용이 잘리지 않습니다. 즉, 읽기에는 이전 데이터의 일부와 새 데이터의 일부가 표시됩니다. 쓰기가 파일 크기를 변경하면 상황이 더욱 혼란스러워집니다.

스트림을 사용하는지 여부 (예 : createReadStream), readFile 또는 readFileSync에 관계없이 모두 true입니다. 디스크에있는 파일의 모든 부분은 노드가 파일을 메모리로 버퍼링하는 과정에서 변경 될 수 있습니다. (여기서 유일한 예외는 writeFileSync을 사용한 다음 readFileSync을 동일한 프로세스에으로 사용하는 것입니다. 쓰기 호출로 인해 쓰기가 완료 될 때까지 읽기가 시작되지 않을 수 있기 때문입니다. 그러나 다른 프로세스가 변경되는 것을 방지하지는 않습니다 파일 중간 읽기, 그리고 당신은 어쨌든 동기화 방법을 사용해서는 안됩니다.)

즉, 파일을 읽고 쓰는 것은 비 원자입니다. 불일치를 피하려면 임시 이름을 사용하여 파일을 작성한 다음 쓰기가 완료되면 rename 파일을 작성해야합니다.