2012-04-02 3 views
4

내 응용 프로그램은 부동 소수점 숫자의 TextFile을 천천히 읽습니다. 때때로 상황이 바뀌고 파일을 다시 작성해야합니다. 몇 가지 예제 코드 :읽고있는 파일을 쓰는 방법은 무엇입니까?

procedure TAMI_Column_Selector.read_continuously (file_name: string); 
var infile: TextFile; 
    f: Double; 
begin 
    AssignFile (infile, file_name); 
    Reset (infile); 
    try 
     while not EOF (infile) do 
     begin 
     Read (infile, f); 
     process (f); // this may take quite some time, seconds or even minutes 
     end; // while 
    finally 
     CloseFile (infile); 
    end; // try..finally 
end; // read_continuously // 

어떻게 읽을 수있는 파일을 쓸 수 있습니까? 좀 더 구체적으로 :

  1. 어떻게 읽을 수있는 파일을 쓸 수 있습니까?
  2. 응용 프로그램이 그 순간에 파일을 읽으려고 할 때 충돌을 방지하는 방법 이 쓰여지고 있습니다.
  3. 내 응용 프로그램은 파일이 다시 작성되었음을 어떻게 알 수 있습니까?

은 내가 질문에 대한 첫 번째는 메모리에 파일을 읽는하고 (기록하고 메모리에서 읽을 수있는이 TextFile이) 그것을 읽을 해결할 수 있다고 생각? 그렇다면 여전히 파일을 테스트 할 수있는 방법이 남아 있습니다.

누구나이 문제에 대한 (우아한) 해결책이 있습니까?

미리 감사드립니다. 또한 읽기 위해 열려있는 파일에 쓰려면 윈도우 7

+1

불완전한 읽기에 강건한 프로그램을 읽게하십시오. 그런 다음 Pascal IO가 아닌 최신 IO (즉,'TFileStream')를 사용하십시오. 작가가 파일을 열 때'fmShareDenyWrite'를 지정하십시오. 독자가 'fmShareDenyNone'을 지정하십시오. 또는 데이터베이스를 사용하십시오! –

+0

내가 설명한 상황은 가져 오기 기능이므로 csv-files를 사용합니다. 데이터베이스 dsoes는 모든 문제를 해결하지만이 경우에는 실현 가능하지 않습니다. – Arnold

답변

4

에 델파이 XE를 사용

, 일반적으로 작가가 할 필요가 특별한 일이 아니다. 파일을 열어 둔 다른 모든 사용자가 을 사용하여 파일에 쓸 수있는 경우, 의도 한 작성자는 파일을 쓰기 위해 열어서 파일에 쓰고 닫을 수 있습니다. 다른 사람 이 파일에 쓸 수있는이 없으면 의도 한 작성자가 파일을 처음 열 수 없으므로 아무 것도 할 수 없습니다.

쓰기도 허용하면서 파일을 여는 방법은 사용중인 열기 방법에 따라 다릅니다. CreateFile 일 경우 dwDesiredAccess 매개 변수는 보통 GENERIC_READ이고 dwShareMode 매개 변수는 FILE_SHARE_READ or FILE_SHARE_WRITE입니다. TFileStream을 사용하는 경우 생성자의 모드 매개 변수는 fmOpenWrite or fmShareDenyNone이어야합니다. AssignFileReset을 사용하는 경우 FileMode 전역 변수를 설정해야하지만 공유 모드를 지원하지 않으므로 파스칼 스타일 I/O를 사용할 수 없습니다.

동시에 쓰는 파일을 읽는 것은 본질적으로 충돌을 일으키지 않습니다. 그것은 확실히 OS 레벨에서 문제를 일으키지 않습니다. 프로그램이 실패하면 읽기 실패를 예상하기 위해 작성되지 않았기 때문입니다. 내용을 읽을 때 API 결과를 확인하여 요청한 바이트 수를 읽었는지 확인하십시오. 읽기 및 쓰기 응용 프로그램이 서로 통신하게 할 수도 있습니다. 동기화 객체를 사용하여 파일에 대한 액세스를 직렬화하거나 작성자가 파일을 변경했음을 나타내는 신호를 판독기에 보내고 이전 읽기가 더 이상 정확하지 않을 수 있습니다. 세부 사항을 다루는 것은 당신에게 달려 있습니다.

독자가 파일의 복사본을 메모리에 보관하려고한다면 쓰기 액세스 공유에 신경 쓰지 않아도됩니다. 대신 파일을 열고 읽기 액세스 만 공유하고 파일의 복사본을 메모리에 만들고 파일을 닫을 수 있습니다. 작가는 파일을 열 수 없으므로 독자 프로세스에서 짓밟을 염려없이 파일을 열 수 있습니다.독자가 무언가가 변경되었음을 독자에게 알릴 수 있으며 독자는 전체 파일을 다시로드하거나 변경된 부분을로드 할 수 있습니다. 필자는 독자에게 전체 파일을 읽지 않고 메모리 복사본과 다른 점을 발견 할 수있는 다른 방법은 없습니다.

쓰기를 유지하는 또 다른 방법 읽기를 방해하는 것은 트랜잭션을 사용하는 것입니다. 그러나 Transactional NTFS은 단계적으로 제거되고 있습니다. Microsoft는 a list of alternatives을 게시 했으므로 필요에 맞는 것을 찾을 수 있습니다.

+0

정교한 답변을 주셔서 대단히 감사합니다. 나는 그것이 피해야하는 모든 함정에 대답한다고 생각합니다. 내가 아직 모르는 한 가지가 있습니다. 파일이 (다시) 쓰여진 것을 어떻게 알 수 있습니까? – Arnold

+0

3 번 질문을 더 정확하게 말해야합니다. 내 말은 다른 응용 프로그램에서 수정되는 파일을 어떻게 찾을 수 있는지입니다. 나는 3 절을 설명 내의 변화를 감지하는 설명으로보고있다. 더 많이 의도했다면 나는 무엇을해야할지 확신이 없습니다. – Arnold

+0

그게 내 가정입니다. 하나 이상의 프로세스가 읽고 있고, 하나 이상의 프로세스가 쓰고 있습니다. 프로세스가 다른 프로세스가 파일을 수정했다는 것을 알 수있는 확실한 방법은 다른 프로세스가 그것을 수행했다는 것을 알려주는 것이다. 그게 세 번째 단락의 두 번째 부분을 차지하는 부분입니다. [ReadDirectoryChangesW'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465.aspx)를 사용하여 디렉터리의 파일 크기 나 마지막 쓰기 시간이 변경된 것을 검색 할 수도 있습니다 . –

관련 문제