2016-10-25 14 views
2

일부 프로그램 (그림판과 같은 이미지 프로그램, 메모장 및 워드 패드와 같은 텍스트 편집기 등)은 파일을 열고 내용을 메모리에로드 한 다음 파일 잠금을 해제합니다. 프로그램이 잠겨 있지 않아도 해당 파일을 사용하고 있는지 확인하는 방법이 있습니까?잠겨 있지 않은 파일이 열려 있는지 확인하십시오.

예를 들어, image1.bmp가 Paint에서 열려 있어도 내 프로그램은 파일이 잠겨 있지 않기 때문에 디스크에있는 image1.bmp의 복사본을 덮어 쓸 수 있습니다. 이제 그림판에서 열려있는 image1.bmp의 복사본이 디스크에있는 image1.bmp의 복사본과 다릅니다.

내 프로그램은 C#으로 작성되었습니다. 나는이 방법을 사용하여 파일이 잠겨 있는지 확인하지만 대개의 경우에는 작동하지 않습니다. Is there a way to check if a file is in use?

어떤 해결책이 있습니까?

+1

의 사용 가능한 복제 http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file :

은이 질문에서 적응 -is-in-use – Jules

+0

위 링크를 참조했습니다. 해당 솔루션은 파일이 잠겨있을 때만 작동합니다. – JohnRL

+0

ok, 좋습니다. – Jules

답변

0

"이제 그림판에서 열리는 image1.bmp 사본" - 여기 실수는 있습니다. 파일은 그림판에서 더 이상 열리지 않습니다. 그것은 열리고, 읽히고, 그 다음 닫혔다. 페인트는 파일을 전혀 열어 두지 않습니다. 단지 내용이 RAM 메모리에 COPY되어 있습니다. 다른 방법으로 말하면 - MS Paint에서 그림을 보는 것이 파일이 열려 있다는 것을 의미하지는 않습니다.

문서를 다른 사람에게 빌려주는 것과 비슷합니다. 그런 다음 복사하여 반환합니다. 그 사람은 문서를 더 이상 "보유하지"않습니다. 그는 그 사본을 별도로 가지고 있습니다. 그리고 문서를보고 단지 어느 시점에서 누가 그 사본을 만들었을지를 알기위한 방법은 없습니다. 컨텐츠의 RAM 단지 사본이있다,

File file = Open("image.png"); 
Image img = ImageFromFile(file); 
file.Close(); 

... 

img.Save("image.png"); 

여기에 어떤 파일이 모두 개방되고 있지 :

퍼팅의 또 다른 방법은이 의사입니다.

참고 : 실제로 페인트 - 프로세스 탐색기에서 열린 핸들을 표시 할 수 있는지 확인한 결과 그림판에서 파일을 열었습니다. 해당 이름의 파일에 대한 핸들이 전혀 표시되지 않았습니다.

0

다음은 내가 생각해 낸 것입니다. 열려있는 모든 프로세스에서 창 제목을 확인합니다. 프로세스에 윈도우 제목이있는 경우 찾고있는 파일의 이름이 포함되어 있는지 확인합니다.

일부 응용 프로그램은 단일 인스턴스에서 여러 파일을 열 수 있으므로 100 % 작동하지 않습니다. Getting a list of all applications

 bool isFileOpen(string file) 
      {  
      string windowTitle = ""; 


      Process[] myProcesses = Process.GetProcesses(); 

      foreach (Process P in myProcesses) 
      { 
       if (P.MainWindowTitle.Length > 1) 
       { 
        windowTitle = P.MainWindowTitle; 
        if (windowTitle.Contains(file) == true) 
        { 
         return true;       
        }      
       } 

      } 
      return false; 

     }