2013-01-28 3 views
2

우리가 내가 파일 핸들에 데이터를 쓰고 말할 수 있도록 :어떻게 해제를 CreateFile

hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
//[snip error check] 
try 
{ 
    if (!WriteFile(hFile, buffer, count, ref bytesWritten, null)) 
     throw new Win32Exception(GetLastError()); 
} 
finally 
{ 
    CloseHandle(); 
} 

를 데이터의 내 기록이 실패하면, 나는 핸들을 닫을 때 파일이 삭제되고 싶어요. 예 : 파일을 "un-CreatFile'd"으로 지정합니다.

  1. 는 경쟁 조건,있다 :

    hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
    //[snip error check] 
    try 
    { 
        try 
        { 
         if (!WriteFile(hFile, buffer, count, ref bytesWritten, null)) 
          throw new Win32Exception(GetLastError()); 
        } 
        finally 
        { 
         CloseHandle(); 
        } 
    } 
    catch 
    { 
        DeleteFile(filename); 
        throw; 
    } 
    

    그 접근 방식 두 가지 문제가 있습니다


    나는 문제가 발생했을 경우 파일을 삭제, 명백한 시도했습니다 누군가가 내 파일을 닫은 후에 열 수 있지만 삭제하기 전에

  2. 을 만들 수 있습니다. 파일이 아니지만 삭제하십시오.

    FILE_FLAG_DELETE_ON_CLOSE :

는 내가 뭘하고 싶은 것은 소급 지정 에 대한 방법 파일이 핸들의 모든이 닫힌 후 즉시 삭제 될 지정된 핸들을 포함하고 다른 열려 있거나 복제 된 핸들.

내가 열어 본 파일입니다.

나는 파일을 만들었습니다. 확실하게 나는 그것을 창조 할 수있다! 모두 전에 플래그를 지정하는 것을 잊었 기 때문에?

+0

흥미로운 질문입니다. 해당 플래그를 소급하여 추가 할 수있는 것은 당연합니다. 나에게 소리를내는 것은 임시 파일을 사용하고 성공적으로 작성한 후에 이름을 변경해야하므로 "삭제하기 전에"다른 파일을 열지 않아야한다는 것입니다. – noelicus

+0

밀접하게 관련 : http://stackoverflow.com/questions/3593768/is-there-a-way-to-remove-file-flag-delete-on-close –

답변

5

, 당신은

  1. FILE_SHARE_DELETE을 지정할 수 있습니다.
  2. FILE_FLAG_DELETE_ON_CLOSE
  3. 두 번째 핸들을 닫습니다.
  4. 모든 핸들이 닫히면 파일이 삭제됩니다.

이는 CreateFile의 설명서에 FILE_FLAG_DELETE_ON_CLOSE 설명에서 설명된다 :

파일은 핸들의 모든 지정된 핸들 및 을 포함하는를 폐쇄 직후 삭제 될 다른 열려 있거나 이중화 된 핸들. 파일에 대한 열린 핸들이있는 경우 FILE_SHARE_DELETE 공유 모드로 모두 열지 않으면 호출이 실패합니다. 자동 삭제가 충분하지 않은 경우


, 당신은 파일 생성을 가하고, 트랜잭션 NTFS로 볼 수 있으며, 필요한 경우 모두 다시 압연 후 트랜잭션에 기록합니다.

+0

좋은 대답입니다.이 변경은 권한을 가진 사람이 자신의 프로그램 아래에서 파일을 삭제할 수 있음을 의미합니다. FILE_SHARE_DELETE를 건너 뛰고 단순히 첫 번째 핸들을 닫는 것이 처음일까요? – HerrJoebob

+0

@HerrJoebob : 아마도 첫 번째 핸들을 사용중인 것이 아무것도없는 경우 일 수 있습니다. –

+0

대기 ... 첫 번째 핸들을 먼저 닫으시겠습니까? 아니요, 작동하지 않을 것입니다. 원래 경쟁 상태로 돌아 왔습니다. –

1

Windows 2003 서버 또는 Vista 이상을 사용하는 경우 ReOpenFile()을 사용하십시오. 다시 열어 놓은 핸들에 대해 새 '플래그'매개 변수를 지정할 수 있습니다. 부끄러운 일은 분명히 XP에서 사용 가능하지 않습니다. 원래 파일을 열 때 윈도우의 모든 버전에서

+0

이것은 실제로 "두 번째 시간 열기 "내 대답에 명시된 바와 같이. 'ReOpenFile'의 장점은 파일이 경로가 아닌 기존의 열린 핸들에 의해 식별된다는 것입니다. –

관련 문제