2014-07-24 6 views
0

Visual Studio 2008 .NET 버전 3.5를 사용하여 C++/CLI 프로그램을 작성합니다.텍스트 파일에 쓰기 및 즉시 사용 가능하게 함 (C++/CLI)

이 프로그램은 COM 포트에서 데이터를 수신합니다. 받은 문자열이 특정 형식이 아닌 경우 프로그램은 해당 줄이있는 오류 메시지를 로그 파일에 출력합니다.

요구 사항 중 하나는 컴퓨터 운영자가 들어 와서 로그 파일을 점검 할 수 있다는 것입니다.

여기 (일종의) 내 프로그램입니다 : 내가 로그 파일의 파일 크기를 확인하는 경우 Flush의 실행 후

FileStream^fs = File::Create("erorr-log.txt"); 
StreamWriter^sw = gcnew StreamWriter(fs); 

// while receiving data from COM port 
// if data is not in expected format 
sw->WriteLine("Error in received data"); 
sw->WriteLine(received_string_data_from_port); 

sw->Flush(); 
sw->Close(); 

, 그것은 동일하게 유지됩니다. 메모장에서도 열 수 없습니다.

Close 실행 후 파일 크기가 변경되고 메모장에서 열 수 있습니다.

질문 : 내용이 왜 사용할 수 없습니다Flush 후? Flush 즉시 파일을 '업데이트'하지 않아야합니까? 마지막 줄에있는 Log()의 경우와 마찬가지로 How to: Open and Append to a Log File에?

+0

올바르게 기억하면 Windows에서 쓰기 위해 파일을 열 때 기본적으로 프로세스에만 독점적으로 잠겨 있습니다. 'flush' 호출은 디스크에 기록하지만 파일은 여전히 ​​다른 사람들이 읽을 수 없습니다. 파일을 닫을 때까지는되지 않습니다. 나는 C++ CLI 나 .NET에서 공유 모드로 어떻게 열지 모르겠다. –

답변

2
FileStream^fs = File::Create("erorr-log.txt"); 

File :: Create()는 편리한 방법으로 FileStream을 구성하기 위해 많은 기본값을 선택합니다. 원하지 않는 기본값은 FileShare :: None을 사용합니다. 그것은 매우 안전한 선택이며, 아무도 부분적으로 쓰여진 파일을 보지 못할 것입니다. 그러나 파일이 닫힐 때까지 아무도 파일에 액세스하지 못하게합니다.

간단한 해결 방법은 전혀 사용하지 않는 것입니다. 대신 StreamWriter(String) 생성자를 사용하십시오. 또한 기본값을 선택하지만 FileShare :: Read를 사용합니다. 너는 좋아해. 이 클래스는 FileStream과 달리 텍스트 스트림을 작성하고 자동으로 플러시하므로보다 합리적인 안전한 선택입니다.