2010-06-27 3 views
5

TFileSteam을 사용하여 로그 파일을 엽니 다. 다른 프로세스에서이 로그 파일을 읽을 수 있기를 바랍니다. 나는 fmShareDenyWrite 모드가 이것을 허용 할 것이라고 생각했다.fmShareDenyWrite 모드가 작동하지 않습니다.

그러나 다른 프로세스에서 파일을 열려고하면 오류가 발생합니다. 예를 들어 명령 줄에서 파일을 입력하려고하면 "프로세스가 다른 프로세스에서 사용 중이므로 파일에 액세스 할 수 없습니다"라는 메시지가 표시됩니다. 여기

파일 초기화 코드 :

if FileExists(AutoLogFileName) then 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmOpenReadWrite or fmShareDenyWrite) 
else 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmCreate or fmShareDenyWrite); 

참고 : 델파이 버전을 사용하고 6.

+1

다른 앱에서 사용하는 모드는 무엇입니까? – mj2008

답변

8

이 이미 D6의 버그인지 몰라,하지만 그건 별개의 가능성이다. D2007에 대해보고 된 QC 보고서는 QC 65767 : http://qc.embarcadero.com/wc/qcmain.aspx?d=65767입니다. 이 보고서는 D2010 (정확히는 14.0.3467.22472)에서 해결되었으므로 이제 폐쇄되었습니다. (Gabr의 코멘트하라는 메시지)

업데이트 :

당신은 모드를 존중하지 자신의 TFileStream을 자손을 만들 수 있습니다. Create(const AFileName: string; Mode: Word; Rights: Cardinal) 생성자 (두 개의 오버로드 된 생성자가 있음)를 무시하고 모드 매개 변수를 직접 처리하십시오. 원래 생성자에서 코드를 복사하여 변경

if Mode = fmCreate then 
    begin 
    inherited Create(FileCreate(AFileName, Rights)); 

myMode 유형 말씀의 로컬 VAR입니다
if (Mode and fmCreate = fmCreate) then 
    begin 
    myMode := Mode and $FF; 
    if myMode = $FF then 
     myMode := fmShareExclusive; 
    inherited Create(FileCreate(AFileName, myMode, Rights)); 

.

+0

해당 QC 항목도 솔루션을 제공합니다. – gabr

2

mfCreate 모드가 어떤 주 속성을 제대로/일을 작동하지 않습니다. 해결하려면, 당신이 파일을 직접 처리 만들고 생성자에 전달해야합니다

응원

+0

코드 샘플을 제공해 주시겠습니까? – Aheho

관련 문제