2016-07-12 1 views
1

tarfile을 사용하여 .tar 파일을 추가하려고하지만 파일이 사용 중인지 여부를 알 수 없습니다. 파일을 추가 할 수 있는지 확인하려면 어떻게합니까?tar 파일을 사용하여 tar 파일을 쓸 수 있는지 어떻게 확인할 수 있습니까?

try: 
    with tarfile.open("foo.tar", "a:") as tar: 
     tar.add("bar.txt") 
except tarfile.TarError: 
    print "error" 

을이 때때로 오류가 발생하지만 때로는 및 끝에 tar 파일은 내가 기대했던 모든 파일이없는하지 않습니다

나는 시도했습니다.

내 계획은 루프에 넣고 작동 할 때까지 계속 시도하는 것입니다.

다른 옵션을 사용하는 경우가 대부분이지만 다른 경우에는 tarfile이 이런 일을 담당해야한다고 생각합니다. 새 파일을 검사하는 tarfile에 대한 래퍼를 작성하여 tar.getmembers() 목록에 표시 할 수 있습니다.

+0

일반적으로 파일이 사용 가능 * 가능한 *이면 어떤 파일에도 쓰지 않아야합니다. append-mode는 줄과 같은 버퍼가없는 로그와 같은 단순한 파일에서는 안전하지만, tar 파일은 마지막 몇 블록을 덮어 써야합니다. – o11c

+0

@ o11c "tarfiles가 마지막 몇 블록을 덮어 씁니다"라는 것이 무슨 뜻인지 잘 모르겠습니다. –

+0

.tar 파일은 (검색 불가능한) 512 바이트 레코드로 구성됩니다. 아카이브의 끝은 최소한 두 개의 연속 된 0으로 채워진 레코드로 표시됩니다. 추가하기 위해 제로화 된 레코드를 제거해야합니다. – o11c

답변

2

이 작업을 수행하는 안전한 방법은 다음과 같습니다

  • 파일의 복사본을 만듭니다.
  • 사본을 추가 모드로 엽니 다.
  • 원본의 복사본 이름을 바꾸십시오.
+0

감사합니다. 2 개의 프로세스가 동시에 복사본을 만들고 다른 복사본에 추가 한 다음 그 중 하나의 프로세스가 다른 프로세스의 최상위에 재 명명되는 문제가 있습니까? –

+0

@ R.Mckemey 예, 그럴 가능성이 있습니다. 모든 코드를 제어한다면'flock'을 사용할 수 있습니다. 그러나 최악의 경우에도 손상된 파일을 가져 오는 대신 업데이트 중 하나를 기본적으로 잃게됩니다 (전원 손실 또는 충돌 프로세스와 유사). – o11c

관련 문제