2009-04-26 2 views
6

다른 응용 프로그램에 이미 파일이 열려 있기 때문에 I/O 오류 32 (공유 위반)가 발생합니다. 나는 "fmOpenRead 또는 fmShareDenyNone"으로 FileMode를 설정해 보았습니다 만, 이제는 이것이 어쨌든 텍스트 파일에는 적용되지 않습니다.Delphi - 공유 위반 텍스트 파일 열기

다른 응용 프로그램에서 열려있는 텍스트 파일을 읽을 수있는 방법이 있습니까?

var 
    f: TextFile; 
begin 
    FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLICABLE TO TEXT FILES!! 
    AssignFile(f, FileName); 
    Reset(f); 
+0

왜 텍스트 파일을 너무 좋아합니까? 적절한 파일 액세스 및 공유 모드를 허용하는 스트림 클래스를 사용하지 않는 이유는 무엇입니까? – mghie

+0

왜냐하면 한 번에 한 줄씩 읽고 싶기 때문입니다. TFileStream에는 그 방법이 없습니다. 나는 버퍼를 가득 채우고 CR/LF를 읽을 수 있다고 생각한다. – Simes

+1

'TStreamReader'를 사용하여'TFileStream'에서 행을 읽을 수 있습니다. 그것은'ReadLine()'메소드를 가지고 있으며 내부적으로 버퍼링을합니다. –

답변

1

이렇게하면 문제가 즉시 해결됩니다. TStringList를 사용하여 파일을로드하십시오. 그냥 전화 :

... 
var sl: TStringList; 
begin 
    sl := TStringList.create(); 
    try 
    sl.loadFromFile(Filename); 
    ...do your stuff here... 
    finally 
    freeAndNil(sl); 
    end; 
end; 

나는 텍스트 파일을 다루는 것으로 나타났습니다. TStringList를 사용하는 것이 가장 좋습니다. 그렇지 않으면 TFileStream에 가서 거기에 개봉 모드를 지정할 수 있습니다.

+0

도움이되지 않습니까? 심즈, 이걸 시도해 봤어? –

+0

LoadFromFile()은 (적어도 Delphi 5 및 2007에서는 사용합니다) 모드에 대해 "fmOpenRead 또는 fmShareDenyWrite"를 사용합니다. 이것은 OP가 원하는 것이 아닙니다. – mghie

+0

??? 하지만 이것은 Simes가 원하는 것입니다. 그는 단지 그것을 사용하는 다른 프로세스에 신경 쓰지 않고 파일을 읽기를 원합니다. 그것이 그의 질문이었습니다. –

3

다른 프로세스에서 파일을 연 방법에 따라 다릅니다 ... 파일을 독점적으로 열면 전혀 성공하지 못합니다.

TextFile은 오래된 모자입니다. 이전 스타일의 DOS와 호환되도록 독점 모드로 열립니다. TFileStream 또는 유사하게 사용해야합니다.

TStringList는 다른 프로세스가 수행중인 작업에 따라 다시 작동 할 수도 있습니다. 그러나 파일이 쓰여지는 경우 (예 : .log 파일) fmShareDenyWrite가 작동하지 않습니다.

+0

어떻게 해야할지 모르겠습니다. 다른 프로세스는 파일을 열고 있지만 메모장은 기록되는 동안 파일을 성공적으로 열 수 있습니다. – Simes

+0

운이 좋았던 것처럼 보입니다. 그냥 TextFile을 버리십시오. –

+0

@Simes, 나는 파일이 어떻게 열리고 있는지 정확히 보여주는 프로세스를 개략적으로 설명한다. http://stackoverflow.com/questions/737053/log-file-monitor/739328#739328 –

1

올바르게 기억한다면 텍스트 파일에만 적용되는 Textfilemode 변수도 있습니다. 어쩌면이 같은

+0

완벽 할 수는 있지만 컴파일되지 않고 도움말에서 찾을 수 없습니다. – Simes

1

:

vFileList := TStringList.Create; 
    try 
    vFileStream := TFileStream.Create('myfile.txt', fmOpenRead or fmShareDenyNone); 
    try 
     vFileList.LoadFromStream(vFileStream); 
    finally 
     vFileStream.Free; 
    end; 
    // Use vFileList 
    finally 
    vFileList.Free; 
    end; 
12

오히려 LoadFromFile보다 TStringList를의 LoadFromStream 방법을 사용합니다. 당신은 잠금 그런 식으로 제어 할 수 예는 TStringList에로드 할 스트림을 사용하고 있음을

var 
    slFile: TStrings; 
    stream: TStream; 
begin 
    slFile := TStringList.Create; 
    try 
     stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone); 
     try 
     slFile.LoadFromStream(stream); 
     finally 
     stream.Free; 
     end; 

     //Use the stringlist 
    finally 
     slFile.Free; 
    end; 
end; 

. 조각 만 읽고 싶다면 그렇게 할 수 있습니다. 스트림에서 읽으십시오.

+0

문제를 해결하고 해결합니다. 메모리 사용에 관해서 만 관심이 있습니다. 전체 파일이 메모리에로드됩니다. 이것은 문제 일 수 있습니다. – Ghigo