2010-06-29 3 views
1

파일 처리기 클래스에서 작업 중이며 파일 스트림에 문제가 있습니다. 추가 및 덮어 쓰기와 같은 작업을위한 기능을 제공하는 것은 fopen에 전달 된 모드를 변경하는 간단한 문제입니다.PHP - fwrite의 단점?

그러나 쉽게 삽입, 업데이트 및 삭제할 수있는 방법을 제공하는 것이 더욱 어려워지고 있습니다. 꽤 많은, 내가 겪고있는 모든 문제는 fwrite에 있습니다.

삽입 - 필자가 알 수있는 한, fwrite를 사용하여 파일의 끝이 아닌 다른 위치에 문자를 삽입하는 방법은 없습니다. 두 가지 옵션은 file_get_contents를 사용하고 fseek/fwrite를 사용하여 파일을 확장하는 것입니다.

삭제 - 불행히도, fwrite를 사용하여 NULL을 쓰려고하는 것은 문자를 '삭제하는'것과 같은 것이 아닙니다. 데이터 삽입과 마찬가지로 옵션은 file_get_contents 및 fseek/fwrite입니다.

업데이트 - 파일 내의 데이터 업데이트는 삽입/삭제 문제의 조합입니다. 새 값이 이전 값보다 짧으면 추가 문자를 삭제해야합니다. 새 값이 이전 값보다 길면 추가 문자를 삽입해야합니다. 길이가 같으면 fwrite를 사용하면됩니다.

바라건대, 내가이 문제를 깨끗하게 해결할 수없는 것을 알고 있습니다. 내가 찾은 옵션 중 하나는 file_get_contents (전체 파일이 메모리에 읽혀 져야하므로 상관하지 않음) 또는 fseek/fwrite를 사용하여 파일의 길이를 변경하는 것입니다 (이는 나에게 복잡하게 보입니다).

누구나 생각하지 못한 아이디어가 있습니까?

감사합니다.

+0

데이터베이스를 사용하여 수집합니까 옵션이 아닌가요? –

+0

맞습니다. 불행히도 데이터베이스와 달리 플랫 파일을 처리해야합니다. 하지만 클래스에서 깨끗한 인터페이스를 사용하여 데이터베이스 핸들러로 다시 사용할 수 있기를 기대했습니다. – Ogo

답변

1

file_get_contents()를 사용하는 대신 고정 크기 '청크'로 파일을 임의로 섞을 때 fseek() 및 fwrite()를 사용할 수 있습니다. 논리는 매우 간단하지만 C 라이브러리가 아닌 PHP로 직접 구현하면 성가시고 느릴 것으로 생각됩니다.

+0

그래, 내가 언급 한 fseek/fwrite 옵션이다. 나는 그것에 대해 같은 방식으로 느낀다. – Ogo

1

그게 전부입니다. 거의 모든 언어가 똑같이 할 것입니다. 권장되는 방법은 임시 파일을 사용하고 원본 파일을 조각 단위로 전송 한 다음 임시로 임시 파일을 원본 파일 위로 이동하는 것입니다.

그러나 이러한 것들을 수행하는 프로그램이 있으며 훨씬 더 최적화 된 방식으로, 주로 데이터베이스 엔진이 있습니다.