2017-09-06 7 views
0

저는 File.WriteAllBytes를 사용하여 파일에 변경 사항을 기록합니다.파일 손상 정전 후

WriteAllBytes를 호출 한 후 정전이 발생하면 파일이 항상 손상됩니다. 문제는 이것이 내 저장 함수를 실행하는 동안뿐만 아니라 함수 실행이 끝난 후에도 발생합니다. 저장 후 한 시간이 지나면 가끔씩 발생합니다.

BinaryWriter를 사용해 보았지만 동일한 결과가 나타납니다. 또한 임시 파일을 사용하여 해결 방법을 구현하려고했습니다. 문제는 File.Copy도 동일한 동작을합니다. 즉, 임시 파일을 만들고 런타임 중에 전원 중단이 발생하면 파일이 손상됩니다.

대조적으로 내가 파일을 쓰고 난 후에도 작업 관리자에서 내 응용 프로그램을 죽인다 고하더라도 파일을 읽은 후 몇 초가 지났지 만 파일이 손상되지 않습니다.

왜 이런 일이 발생했는지 알 수 있고 대안을 제시 할 수 있습니까? 설명서에 따르면

+0

파일을 닫았습니까? 아니면 코드를 넣을 수 있습니까? – Karuntos

답변

0

, WriteAllBytes

은 새 파일을 작성하는 파일의 지정된 바이트 배열을 기입하고 파일을 닫는다. 대상 파일이 이미 있으면 덮어 씁니다.

물론 파일이 모두 WriteAllBytes에 의해 작성되고 닫혀 있기 때문에이 방법이 반환 된 직후에 디스크에 안정적으로 있어야한다는 가정이 있습니다. 하지만 이는 강제 될 수있는 파일 시스템 캐싱 정책 때문에 잘못된 가정입니다. 게다가, 파일 시스템이 캐시를 디스크로 (그리고 "write-through"파일 시스템으로) 플러시하고 하드웨어가 "성공"표시를 리턴하더라도, 하드웨어 캐시에 의해 지연되기 전에 (매우 짧은 지연 임에도 불구하고) 지연이 있습니다. 데이터는 실제로 물리적으로 디스크에 기록됩니다.

데이터가 매우 중요하여 정전이 지속되는 경우 UPS가 설치되어 있어야합니다.

플러그를 뽑기 위해 1 시간 정도 기다렸다가 파일 시스템 캐싱으로 인한 것이 아닌 것처럼 파일 손상이 의심되는 것으로 보입니다. 논리에 버그가 있거나 내부 또는 외부 리소스 충돌이있을 수 있습니다.

몇 가지 시도해 보겠습니다.

  1. 는 합리적으로 가능한 한 이후 즉시 즉시 WriteAllBytes의 복귀 후 파일의 무결성을 확인하거나 테스트 고안 (응용 프로그램의 내부에 바람직하게,하지만 다른 applciation에 옆에 실행).
  2. 프로그램을 종료하고 잠시 기다린 다음 플러그를 당겨 파일에서 손상 여부를 확인하십시오.
  3. 다른 파일도 응용 프로그램에서 작성된 경우 무결성을 확인하십시오. 그들은 또한 부패를 보여 줍니까?
  4. WriteAllBytes을 호출하는 아주 작은 창 테스트 프로그램을 작성하고 실행 중에 플러그를 잡아 당겨보세요. 해당 파일이 손상 되었습니까?
  5. 논리가 "정전"이벤트를 처리합니까? 그 논리로 인해 파일이 손상됩니다.
  6. 가상 컴퓨터가 관련되어 있습니까? 호스트의 플러그를 당기거나 게스트 OS에서 정전을 시뮬레이트하고 있습니까?

마지막으로, WriteAllBytes은 그다지 복잡하지는 않은 널리 사용되는 방법입니다. 나는 이것이 당신의 문제를 일으키는 지 의심 스럽다.

0

약간의 검색 후 하드 드라이브에서 캐싱 쓰기를 사용 중이라는 것을 알았습니다. 따라서 정전 후 일부 파일이 기록되지 않습니다. 성능이 응용 프로그램에서 매우 중요하기 때문에 필자는이 기능을 활성화 된 채로두고 대신 필요할 때 fs.Flush (True)를 수행하는 FileStreams를 사용했습니다.

일반적으로 이것은 좋은 연습으로 간주됩니까?