2010-12-10 4 views
0

나는 열려있는 다른 프로그램에서 사용하고 로그 파일을 가지고 있고, 나는 그것이와 내용의 읽을 다음은에 의해 사용에있는 동안이 파일에서 텍스트를 읽기 위해 작동다른 프로세스에서 사용중인 텍스트 파일을 덮어 씁니까?

Dim strContents As String 
    Dim x As New FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
    Dim objReader As StreamReader 
    objReader = New StreamReader(x) 
    strContents = objReader.ReadToEnd() 
    objReader.Close() 

다른 프로그램, 그러나,이 바로 뒤에 나는 빈 텍스트가되도록 텍스트 파일을 자르지 않아도된다. 그러나 파일은 여전히 ​​다른 프로그램에서 사용 중입니다.

나는
Dim sWrite As StreamWriter 
    sWrite = New System.IO.StreamWriter(FullPath, False) 
    sWrite.Write("") 
    sWrite.Close() 

을 시도하지만 난 "다른 응용 프로그램에서 사용"예외를 얻을. I에 유래에보고 인터넷 검색을 해봤지만 내가 답변을 찾을 수없는 것, 그리고 나도 filestreams이 할 수있는 방법을 찾을 수없는, 또는 나는에

Dim fs As New FileStream(FullPath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite) 

감사를 사용하려고 것 전진.

답변

1

이 주제에 대한 공정한 몇 가지 다른 게시물이 있습니다.

How to check for file lock?

Can I simply 'read' a file that is in use?

Detecting whether a file is locked by another process (or indeed the same process)

이 솔루션은 것으로 나타납니다 단지 참고 로그 파일이 너무 결정적 마무리이 도움이됩니다 관리되지 않는 리소스를하는 것도

Try 
'Code to read file if its not locked by another app 
Catch as System.IO.IOException 

리소스 경합 문제.

Using fs = New FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) 
    fs.SetLength(0) 
    file.Save(fs) 
    fs.Flush() 
End Using 
실제로 로깅 프로그램은 데이터의 모든 3~5분, 나는 그 쓰기 사이의 로그에서 데이터를 삭제하기 위해 노력하고있어 기록
+0

로그 파일에 기록하는 예약 된 프로세스가 있습니다. 누군가가 서버에 로그인하고 해당 로그 파일을 선택한 상태에서 파일 탐색기를 열어두면 예약 된 프로세스가이 예외를 가져 와서 실행되지 않거나 로그 파일에 쓸 수 없습니다. 그래서 성가신. 파일 탐색기는 파일을 열고 미리보기를 표시하고 닫아야합니다. 그러나 아니요, 파일이 선택되어있는 한 파일을 열어 둡니다. 나는 예정된 과정에서 파일 탐색기를 죽일 수 없다. 그렇게하면 나쁜 문제가 생긴다. – Shavais

0

다른 프로그램이 파일을 잠그기 때문에 운영 체제가 원하는 것을 수행 할 수 없게됩니다. 다른 프로그램을 쓰기 잠금을 해제하지 않는 한.

0

불행히도 문제의 해결 방법은 사용되는 언어에 관계없이 몇 줄의 코드를 추가하거나 수정하는 것만 큼 간단하지 않습니다. resource contention의 고전적인 예를 설명합니다.

이러한 유형의 문제는 액세스 관리자, 즉 프로그램이 다른 프로그램의 내용을 덮어 쓰지 않도록 쓰기를 중재하는 다른 프로세스를 사용하여 가장 잘 해결됩니다. 반대의 경우도 마찬가지입니다.

+0

, 그것은 단지 복잡 : 결정적 마무리에 대한 사용 문, 예를 들어, 사용 사실 로깅을하는 프로그램은 쓰기 사이에 텍스트 파일에 대한 잠금을 해제하지 않습니다. 나는 필자가 글쓰기 중간에 그것을 지우면 이상한 데이터로 끝날 것이라는 개념은 괜찮다. –

+0

** 다른 ** 프로그램에 대한 통제 권한이 있습니까?어떤 식 으로든 * 및 * 두 프로그램 간의 동기화를 보장 할 수 있으면 각 쓰기 후에 파일을 닫습니다(). –

+0

네거티브, 다른 프로그램을 제어 할 권한이 없습니다. –

0

다른 프로세스가 스트림을 닫을 때까지 그렇게 할 수 있는지 확신 할 수 없습니다. 그러나 파일에 쓰는 프로세스를 종료 할 수 있습니다.

다음은 그 예입니다.

Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("notepad") 

For Each p As Process In pProcess 
    p.Kill() 
Next 

확인이 아웃 : http://vbnetsample.blogspot.com/2007/08/start-and-kill-process.html

+0

을 참조하십시오. 그러면 로거가 중지되고 목적을 물리칩니다. 감사합니다. –

관련 문제