2011-07-02 6 views
1

내 프로그램이 파일에 데이터를 로깅하는 동시에 사용자 인터페이스에 들어오는 데이터가 표시됩니다. 나는 기록 된 데이터가 컴퓨터/프로그램/OS/어떤 것이 든 종료되면 2 ~ 2 초 안에 디스크에있게하고 싶다. 데이터는 최소 100 번/초입니다.이름 바꾸기 파일을 자기 자신으로 엽니 다.

로깅이 활성화되어있는 동안 사용자가 로그 파일에 새 이름을 지정할 수있게하려고합니다. 문제는 파일이 열려있는 동안 동일한 프로세스에 의해 파일의 이름을 변경할 수 없다는 것입니다.

테스트 케이스 : 동일한 프로세스가 열려있는 파일에 대한 스트림을 가지고있는 동안

string fileName1 = "test.txt"; 
string fileName2 = "test2.txt"; 

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create))) 
{ 
    sw.WriteLine("before"); 
    File.Move(fileName1, fileName2); //<<-- IOException - The process cannot access the file because it is being used by another process. 
    w.WriteLine("after"); 
} 

그래서, 이 어떻게 프로세스에서 파일의 이름을 변경합니까?

+0

당신은 많은 데이터, 당신은 정말 log4net 같은 로깅 라이브러리 (HTTP를 시도해야 로그인하는 경우 : //logging.apache.org/log4net/). –

+1

유감스럽게도 파일을 이동하거나 이름을 변경하거나 스트림을 사용할 때 파일을 삭제하거나 삭제할 수 없으며 다른 프로그램에서 사용중인 것과 같습니다. –

답변

2

그런 다음 스트림 다시 파일 이름을 변경, 최초의 스트림을 닫아야합니다 : 당신이 쓰고 싶은 경우는 프로세스에 의해 열려있는 동안

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create))) 
{ 
    sw.WriteLine("before"); 
    sw.Close(); 
} 

File.Move(fileName1, fileName2); 

using (StreamWriter sw = new StreamWriter(new FileStream(fileName2, FileMode.Append))) 
{ 
    sw.WriteLine("after"); 
} 
+0

이 작업은 작동하지 않습니다. 그것이 사용하는 블록에있는 동안'sw'을 설정하십시오. 오류 :' '변수 사용하기'때문에 'sw'에 할당 할 수 없습니다. –

+0

알맞은 소리입니다. 그러나 두 번째로 filename2를 의미해야하며 filemode를 올바르게 만들 수 없습니까? 만큼 내가 어떤 스트림이없는 동안 나는 갭 동안 어떤 로깅을 잠그는이 작동 할 것 같아요. – obmoc

+0

좋은 지적. 내 대답을 업데이트했습니다. –

0

당신은 파일의 이름을 바꿀 수 있지만, 그것은 프로그램의 다른 인스턴스에서 이것을 수행하십시오.

시도 FileShare.Write. File.Open에서 사용할 수 있습니다.

using (StreamWriter sw = new StreamWriter (File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) 
{ 
    ... 
} 
0

열기 1 초에 100 번 파일을 닫으면 성능에 영향을 주므로 임시 파일에 로그온하고 10 초마다 임시 파일을 추가 할 수 있습니다. 그것은 당신이 원하는 것을 줄 것입니다.

+0

프로그램이 실행되는 동안 파일이 열려 있습니다. 이름 바꾸기는 사용자가 한 두 번만 수행 할 수 있습니다. – obmoc

+0

파일의 이름을 바꾸려면 열려 있으면 안됩니다. 따라서 로그 항목을 추가하기 위해 매 10 초마다 한 번만 열면 사용자가 프로그램 실행 중에 파일의 이름을 바꿀 수 있습니다. – Peter

0

나는이 답변이 당신의 포팅 프로젝트에서 당신을 도울 수 있지만 아마도 다른 사람들을 도울 것이라고 알고 있습니다!

당신이 FileShare.Delete 플래그를 사용하여 파일을 열 경우 그것은 여전히 ​​열려 비록 당신이 이름을 변경하게됩니다 :)

관련 문제