g++, vc++ 6에서 파일 쓰기 작업을 Atomic 하게 하는 방법이 있

vudghkzm의 이미지

g++, vc++ 6에서 아래와 같은 사항은 일반적으로 어떻게 해결하나요?

파일(File)을 열고, 뭔가 텍스트 데이타를 쓰고, 파일을 닫고 하는 작업이 Atomic 하게 수행되게 하는 방법이 있나요?

예를 들어, 텍스트 데이타를 10 개를 써야 하는데, 이 중에서 5개만 성공적으로 써지고나머지 5개는 쓰기 실패가 되는 경우에는, 먼저 성공적으로 써진 5개의 데이타를 본래 데이타로 돌려놓고 싶다는 것이지요. 즉 쓸려고 한 모든 데이타가 성공적으로 쓰여지지 않았을 때는 하나도 안 쓰여진 것처럼 하고 싶다는 거지요.

이런 경우에 일반적으로 어떻게 하는지 알고 싶습니다.

비행소년의 이미지

파일의 크기가 얼마나 될런지는 모르겠지만.

저 같으면 우선은 써야할 파일을 백업을 받겠습니다. 그러고 나서 새로 만들게될 파일을 다른 이름으로 만들어 놓구요.

여기에서의 작업이 완료가 되면 원본 파일을 새로 만든 파일로 덮어 써야 겠죠.

만일 작업중에 에러가 하나 라도 생기면 백업했던 파일로 복원을 시키 도록 하겠습니다.

그리고 각각의 단계별로 로그를 기록해서, 완료가 정확히 ㅤㄷㅚㅆ는지 안ㅤㄷㅚㅆ는지 기록해서, 불시에 프로그램이 죽는다고 해도, 다음 기동시에 파일을 정리 할 수 있도록 하겠습니다.

높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ

doldori의 이미지

우선 파일을 원래대로 되돌릴 수 있는 방법은 비행소년님 말씀대로 백업 파일을
이용하면 될 것 같습니다. 문제는 10개나 되는 파일에 대해 각각 롤백을 하려면
코드가 복잡해지는데, 전에 bugiii님이 소개해주신 ScopeGuard가 위력을 발휘할
것 같군요.
http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/
기본적으로는 RAII 기법인데 템플릿을 절묘하게 결합한 방법입니다. 위 사이트에서
ScopeGuard의 구현 파일도 다운받을 수 있습니다. 간단하게 예를 들면

#include "ScopeGuard.h"

// drop updates and recover
void recover(const char* fname);

// throw an exception if something goes wrong
void write(const char* fname);

int main()
{
	try
	{
		write("a.txt");
		ScopeGuard rollback = MakeGuard(recover, "a.txt");
		write("b.txt");
		rollback.Dismiss();
	}
	catch (...)
	{
       // do some clean-up if necessary
	}
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.