2012-02-23 2 views
0

내 소프트웨어 용 소프트웨어를 개발하는 데 문제가 있습니다. 달성하고자하는 작업은 그 파일이 다른 프로그램에 의해 지속적으로 액세스되는 동안 파일 (.txt)을 업데이트해야한다는 것입니다.Qn : Windows 파일 잠금 속성 구하기 - Java 또는 C#의 FileHandling 사용

궁극적 인 설정은 다음과 같습니다. 소프트웨어를 계속 실행하고 피드 파일의 내용을 계속 읽습니다 (info.txt라고합니다). 피드 파일 (info.txt)을 지속적으로 업데이트하면서 다른 스크립트를 실행했습니다.

위의 설정을 구현 한 후에 파일을 사용할 때 심각한 충돌이 발생했습니다. 소프트웨어 (AAA라고 함)를 실행하면 info.txt를 수동으로 편집 할 수 없습니다. info.txt를 열고 변경 한 다음 저장을 클릭하면 창에 "프로세스가 다른 프로세스에서 사용 중이기 때문에 파일에 액세스 할 수 없습니다."라는 오류 메시지가 표시됩니다. info.txt를 삭제하려고하면 "AAA.exe에서 파일이 열려 있기 때문에 작업을 완료 할 수 없습니다"라는 오류 메시지가 표시됩니다. info.txt를 지속적으로 업데이트하는 (java) 스크립트를 실행할 때 파일 IO 예외는 다음과 같습니다. java.io.FileNotFoundException : info.txt (다른 프로세스에서 사용 중이기 때문에 프로세스가 파일에 액세스 할 수 없음)

소프트웨어 AAA는 그다지 잘 발달되어 있지 않습니다. (그것은 나의 상용 소프트웨어에 대한 외국 소프트웨어이므로 행동/소스 코드를 수정할 수 없다.) 파일에 접근하는 방식은 파일을 완전히 잠급니다. 내가 부드럽게 temfile 편집을 허용하는 소프트웨어의 프로필 파일에 info.txt에 대한 참조를 지적 생각했지만 AAA를 실행 (그리고 내가 그것을 필요로하기 때문에,이 방법은 실패 할 것이다, 나는 어떤 파일을 변경할 수 없다 그것은 사용하고 있습니다.

나는 소프트웨어 AAA의 주요 개발자 중 한 사람과상의했다. 그는 이것이 현재 문제가 있음을 인정하고 다음 릴리스에서 개선 할 것입니다. 그러나 한편으로 나는 그 체제가 효과가 있기를 바란다. 그는 .NET으로 프로그래밍한다고 말하면서 문제를 해결할 수있는 행을 제공했다.

FileStream fs = new FileStream (@ "info.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare .ReadWrite);

아마도 이러한 인수를 제공함으로써이 파일 스트림을 쓰기 및 읽기 모두에서 공유 할 수 있습니다.

저는 자바 프로그래머입니다. .NET에 대한 경험이 없습니다. 그러나 나는 약간의 연구와 학습을했으며, 그의 코드는 .NET Framework의 CLR에서 실행되는 C#의 신택스임을 깨달았습니다. 내 컴퓨터에 C#을 설치하고 C# 초보 자습서를 공부하고 다음 스크립트를 작성하여 내 문제를 해결하고 싶습니다.

C#이 기본 레벨에서 파일의 액세스 속성을 변경하는 것이 가능하다면, info.txt의 파일 스트림을 열어서 읽기 및 쓰기와 공유 할 수 있습니다. 일단 그렇게하면 info.txt를 업데이트하는 스크립트를 실행 한 다음 info.txt를 새로 고치는 소프트웨어 AAA를 실행할 수 있습니다.

위의 구현을 달성하기 위해 노력하고, 나는 C#을 스크립트로 올 :

=========================== =====================

using System; 
using System.IO; 

class CopyFeed 
{ 
    static void Main() 
    { 
     string fileName1 = "info.txt"; 
     string fileName2 = "info2.txt"; 


     FileStream fs = new FileStream(@fileName1, FileMode.OpenOrCreate,    FileAccess.Write, FileShare.ReadWrite); 
     StreamWriter sw = null; 

     // attempting to unlock part of the file, didn't work 
     /* 
     string contents = File.ReadAllText(@fileName2); 
     fs.Unlock(0, contents.Length * 2); 
     */ 

     while (true) 
     { 
      Console.WriteLine("Copying Feed..."); 

      string contents = File.ReadAllText(@fileName2); 

      try 
      { 
       sw = new StreamWriter(fs); 
       sw.Write(contents); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("CopyFeed :: " + e.Message); 
      } 
      finally 
      { 
       if (sw != null) 
       { 

        sw.Flush(); 
        //sw.Close(); 

       } 
      } 

      Console.WriteLine("Pausing For 2 sec..."); 
      System.Threading.Thread.Sleep(2000); 

     } 



    } 
} 

====================== =======================================================

아마, 내 Java 스크립트는 계속 info2.txt를 업데이트 할 것입니다. 그런 다음이 C# 스크립트를 info2.txt의 전체 내용을 info.txt에 계속 복사합니다. 내가 두 측면에서이 게시물에 도움을 요청하고자 :

  1. 위의 스크립트가 여전히 버그, 그것은이하는 모든 파일 info.txt에 추가 유지하기 때문이다. 모든 반복 작업이 시작될 때 파일의 내용을 지우고 file2의 내용을 복사 할 수있는 방법을 찾고 싶습니다. 지금 스크립트를 실행하면 시간이 지남에 따라 무한히 큰 파일이 생성됩니다.

  2. 위의 설명을 바탕으로 제 해결책이 효과가 있습니까? 더 좋은 선택이 있습니까? (소프트웨어 AAA 동작이 동일하게 유지되는 경우) 문제를 해결할 수있는 방법이 있습니까?

  3. Java를 사용하여 해결책을 찾았습니까? Java는 Windows 시스템과보다 기본적인 수준에서 상호 작용하고 파일을 잠금 해제하는 파일 처리 기능을 갖추고 있습니까?

저는 지난 며칠 동안이 문제를 해결하기 위해 노력해 왔습니다. 나는 통찰력을 제공하는 사람에게 진심으로 감사 할 것입니다!

+0

솔루션 만 작동하는지 알 수 있습니다 ... 현재 가지고있는 코드를 테스트/디버그 했습니까 ??? ??? – MethodMan

+0

안녕하세요, DJ Kraze, 시도했지만 디버깅하지 못했습니다. 그것이 내가 바라는 도움 중 하나입니다. 나는 C#과 파일 처리에 대한 경험이 거의 없다. 나는 거기에서 작동하는 C# 스크립트를 만드는 방법을 모르겠다. 다시 쓰기/복사하기 전에 파일 내용을 지우는 방법이 필요합니다. – Jamesszm

답변

0

테스트 할 수있는 시나리오가 없으므로 설명한 방법으로 잠긴 파일에 액세스 할 수 있는지 알 수 없습니다.

당신은 정적 메서드 File.WriteAllText (네임 스페이스 System.IO)와 파일의 내용을 지울 수 있습니다 : 질문 1)에 관해서는

. 이것은 게시 한 C# 코드에서

string contents = File.ReadAllText(@fileName2); 

과 같습니다.

예 :

System.IO.File.WriteAllText(@"C:\Test\test.txt", ""); 

이상

또는
System.IO.File.WriteAllText(@"C:\Test\test.txt", string.Empty); 

당신은 값을 0으로하여 FileStream의 setLength 방법을 사용할 수 있습니다 :

fs.SetLength(0); 
0

당신의 방법은 방지 할 수 있지만 프로그램에서 FileNotFoundException이 발생하지 않으면 pote를 고려해야합니다. 편집중인 파일에 액세스하려고 시도하는 다른 프로그램에 대해 동일한 예외가 발생하는 경우가 있습니다.

내 작품은 유사한 사용 사례를 가지고 있으며 파일 대신 버전 컨트롤과 직접 인터페이스합니다. 이렇게하면 동시 편집을 수행하는 경우 변경 사항을 병합 할 수 있습니다.

이 방법이 마음에 들지 않으면 System.IO.FileNotFoundExceptions 대신 System.Exception 대신 catch하도록 코드를 변경해야합니다.