2012-07-02 4 views
7

파일이 열려 있는지 확인하는 방법이 있습니까? 내가 생각할 수있는 유일한 것은 Try/Catch 파일 열기 예외를 잡을 수 있는지를 알 수 있지만 파일이 열려 있으면 true/false를 반환하는 메서드를 사용할 수 있다고 생각했습니다.VB.NET 읽기/쓰기를 진행하기 전에 파일이 열려 있는지 확인 하시겠습니까?

현재 System.IO을 사용하고 다음 코드는 Wallet이라는 클래스로 사용합니다.

모든 포인터가 제공됩니다. 고맙습니다!!

+0

File.GetLastAccessTime() 처리 가능성은? –

+1

파일이 열리는 것을 감지하는 직접적인 방법은 없습니다. – coder

+1

이것은 내가 질문 한 내용입니다. http://stackoverflow.com/questions/6706312/how-to-check-if-the-text-file-is-open-and-close-the-text-file 답변을 얻었습니다. – coder

답변

14
Private Sub IsFileOpen(ByVal file As FileInfo) 
    Dim stream As FileStream = Nothing 
    Try 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
     stream.Close() 
    Catch ex As Exception 

     If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then 
      ' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data 
     End If 
    End Try 
End Sub 

Private Shared Function IsFileLocked(exception As Exception) As Boolean 
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1) 
    Return errorCode = 32 OrElse errorCode = 33 
End Function 
+2

훌륭한 솔루션입니다. 예외가없는 경우에 대비하여 stream.close()를 확실히해야한다는 점을 추가하면 문제없이 프로그램을 계속 진행할 수 있습니다. – mlerley

+0

육군 원수가 선언되지 않았다고합니다. –

+2

@CaryBondoc'Imports System.Runtime.InteropServices;'마샬이 선언되지 않은 * 문제를 수정했습니다. ** 팁 : **'마샬 (Marshal) '은 파란 밑줄이 그 위에 마우스를 가져 가면 무엇이 잘못되었는지에 대한 힌트를 얻을 것입니다! –

1

두 개의 제안은 MSDN forum posting에서 파일 열기를 시도하는 것 같습니다.

첫 번째 것은 현재 수행중인 작업과 유사하며 두 번째 작업은 Windows API 함수 (CreateFile)를 사용하고 파일이 사용 중임을 나타내는 잘못된 핸들을 확인합니다. 두 경우 모두 파일이 열려 있는지 여부를 결정하기 위해 오류 상태에 의존합니다. 간단히 말해서, 내 의견으로는 이 아니고이고 System.IO.File.IsOpen 속성이기 때문에 사용하는 메서드가 정확합니다.

+1

안녕하세요. Mark, 저는 StackOverflow 답안에서 링크 내용의 요약이나 특별히 질문에 대답하는 하이라이트를 포함하는 것이 관례임을 알고 있습니다. SE 사이트의 목표는 수년간 지식의 지식, 답변의 자원이되는 것입니다. 링크 전용 답변을 사용하면 운영자는 확신 할 수없는 답변을 찾기 위해 다른 리소스를 파헤쳐 야합니다. 가장 중요한 것은, 귀하의 링크가 끊어지면 미래에이 페이지를 방문하는 모든 사람들에게 귀하의 대답은 쓸모 없다는 것입니다. 링크 tho에 대한 건배! –

+1

@JeremyThompson 나는 그것을 인식하고 있습니다. 이 경우에는 ** 코드에 붙여 넣지 않도록 ** 의식적인 ** 결정을 내 렸습니다. 이것이 적절한 방법이라고 제안하려고하지 않았습니다. 나는 ** 그가 그것을하고있는 방식이 맞다는 것을 ** 안심 시키라고 ** 안심 시키려고 노력했다. IMHO. 그가 WinApi를 사용했다는 제안은 내가하려고하는 것이 아니었고,이 경우에는 과잉이었다. –

+1

Mark, 고맙습니다. 답을 들었지만 잔인하다고 생각합니다.하지만 주제에 대해 좋은 전망을 보여주었습니다! 다시 한번 감사드립니다 :) – Dayan

5

정말 당신이 여전히 파일이 나타나지 않을 경우를 처리하기 위해 시도 캐치가 필요하기 때문에 기능에 '사용 검사에 파일을'사용 아무 소용이 없습니다. 파일 열기는 이미 열려있는 것보다 더 많은 이유로 실패 할 수 있습니다.

또한 체크를하는 함수를 사용하는 것은 성공을 보장하지 않습니다. '사용중인 파일입니다.'는 파일이 이미 열려있는 오류로 인해 열리는 파일에 대해서만 false를 반환 할 수 있습니다. 왜냐하면 수표와 다른 사람이 열어 본 파일을 여는 데 시간이 걸리기 때문입니다.

+1

은 정말로 대답이 아닌 주석이어야합니다 – TruthOf42

관련 문제