2014-12-04 3 views
0

WinForm에서 이진 파일을 읽고 쓰려고합니다. 내가 해냈다 고 생각했지만 파일을 읽으려고 할 때 파일에 기록 된 새 번호 만 가져옵니다 (5 초마다 임의의 숫자가 생성됨). 그 파일은 이전 수치를 유지하지 않습니다. 내가 한 일 :왜 바이너리 파일을 쓸 수 없습니까?

private void timer1_Tick(object sender, EventArgs e) 
     { 
      string path = @"C:\Test\test.dat"; 
      lbl1.Text = string.Format("{0:0.0}", -6 + rand.NextDouble() * 17); 
      double temp = Convert.ToDouble(lbl1.Text); 
      try 
      { 
        if (!File.Exists(path)) 
        { 
        lock (sync) 
        { 
         FileStream outf = new FileStream(path, FileMode.CreateNew, FileAccess.Write); 
         BinaryWriter bw = new BinaryWriter(outf); 
         bw.Write(temp); 
         bw.Close(); 
        } 
        } 
        else if (File.Exists(path)) 
        { 
        lock (synk) 
        { 
         FileStream outf1 = new FileStream(path, FileMode.Create, FileAccess.Write); 
         BinaryWriter bw1 = new BinaryWriter(outf1); 
         bw1.Write(temp); 
         bw1.Flush(); 
         bw1.Close(); 
        } 
        } 
       } 
      catch (System.IO.FileNotFoundException ioe) 
      { 
       MessageBox.Show(ioe.Message); 
      } 

내가 뭘 잘못하고 있니? 나를 도울 수있는 사람이 있습니까? 미리 감사드립니다.

답변

4

FileMode.Create을 사용하여 스트림을 여는 중입니다. 은 기존 파일을으로 덮어 씁니다. 대신 FileMode.Append을 사용하십시오.

파일이 있는지 여부를 확인하지 않아도됩니다.

try 
{ 
    lock (sync) 
    { 
     FileStream outf = new FileStream(path, FileMode.OpenOrCreate | FileMode.Append, FileAccess.Write); 
     BinaryWriter bw = new BinaryWriter(outf); 
     bw.Write(temp); 
     bw.Flush(); 
     bw.Close(); 
    } 
} 
+0

왜 플러시 방법입니까? – Steve

+0

동일한 결과가 나타납니다. 끊임없이 최신 번호. – Steve

+0

@Steve 원래 코드에 있기 때문에. 방금 불필요한'if' 블록을 제거했습니다. –

2

당신이 잘못하고있어 무엇 :

if (!File.Exists(path)) 
... 
else if (File.Exists(path)) 
... 

간단한 else 충분했을 것이다 존재하지 않는 경우에 당신이 그것을 만들 FileMode.OpenOrCreate | FileMode.Append를 사용할 수 있습니다.

그러나 "존재하지 않음"검사가 이미 수행되었거나 "존재"검사가 수행 된 후 파일이 삭제 된 후 누군가가 파일을 작성하는 경우에도 예외는 계속 발생하지 않습니다.


lock (sync) 
... 
lock (synk) 

서로 다른 동기화 개체에 고정된다.

그 외, 타이머 틱은 Windows 메시지에 의해 처리되므로 코드는 항상 동일한 스레드 (UI 스레드)에서 실행됩니다. 즉, lock 구문을 생략 할 수 있습니다 (다른 스레드를 명시 적으로 사용하지 않는 경우).


하지만 사실 모두 코드 조각 파일에 작성하는 파일

을 읽으려고 할 때.


FileMode.Create (MSDN)

bw.Write(temp); 
... 
bw1.Write(temp); 
는 기존 파일을 덮어 씁니다. FileMode.OpenFileAccess.Read은 읽기에 더 적합합니다.

그런 다음 물론 BinaryReader (MSDN)을 사용하십시오.

+1

'OpenOrCreate'도'Append'와 결합하지 않으면 덮어 씁니다. –

+0

@D 스탄 틀리 감사. 나는 읽기 부분에만 집중하고 있었기 때문에 FileMode.Open과 FilAccess.Read를 사용하기 위해 나의 대답을 업데이트했다.나는 정말로 그가 파일에 하나의 난수를 붙이길 원하는지 잘 모르겠다. –

관련 문제