2010-07-21 2 views
2

Delphi 2006에서 TFileStream을 사용하고 있습니다. TFileStream.Seek에서 범위를 벗어난 오프셋을 호출 할 때 다른 반환 값을 얻고 있습니다. 스트림의 처음 아래 위치를 찾으면 함수는 -1을 반환하고 스트림 크기를 초과하여 탐색하면 함수는 스트림이 너무 클 경우 스트림의 위치를 ​​반환합니다. 스트림에서 찾기 연산이 성공했는지 여부를 확인하는 방법이 있습니까? 시프트 오프셋이 현재 스트림 크기의 범위를 벗어나는 경우 TFileStream.Seek이 실패하지 않는 이유는 무엇입니까?델파이 TFileStream.Seek, 무효 검색 오프셋을 확인하는 방법

미리 감사드립니다.

답변

2

예, 파일 크기 이상으로 검색 할 수 있습니다. 여기서 오류가없는 경우 검색이 성공합니다. 그 이상으로 파일 크기를 넘어 파일 영역을 잠글 수 있습니다 (LockFile 참조). 이는 또한 OK이며 일부 RDBMS에서 테이블/레코드 잠금을 구현하는 데 사용됩니다. MSDN에서도

는 :

파일의 마지막 이상의 위치에 파일 포인터를 설정하는 오류 아니다. 파일의 크기는 SetEndOfFile, WriteFile 또는 WriteFileEx 함수를 호출 할 때까지 증가하지 않습니다. 연산을 수행하면 파일의 크기가 파일 포인터 위치에 더하여 버퍼의 크기가 증가합니다.이 경우 은 중간 바이트가 으로 초기화되지 않습니다.

따라서 파일 포인터를 파일 크기 이상으로 설정하면 파일 크기를 늘릴 수 있습니다 (예 : SetEndOfFile).

+2

정확하게'Size' 속성에 대한'TFileStream' 설정자가 구현되었습니다. 지정된 크기 오프셋을 찾아서'SetEndOfFile()'을 호출합니다. –

0

이 함수는 windows 함수를 호출하고 결과는 windows 함수에서 가져옵니다.

Seek 값이 유효하면 코드를 체크인하는 경향이 있습니다. 이 작업을 수행해야한다면 TFileStream의 자손을 만들 수 있습니다. TRangeCheckingFileStream은 범위 검사를 seek 메서드에 포함하고 예상 할 수있는 값을 반환합니다.