2012-01-10 2 views
4

파일을 완전히 지우려면 물리적 영역에 0을 써서 파일을 삭제하고 싶습니다.하드 드라이브에서 실제 위치 파일을 가져 오는 방법

파일은 항상 전체 블록이 아닌 하드 드라이브에 조각으로 저장 될 수 있습니다.

나는 물리적 영역을 말할 때. 나는 파일이 저장된 물리적 섹션을 의미하거나 "제로 쓰기"를 수행 할 수있는 섹션에 대한 참조를 의미합니다.

더 나은 C#.

+1

.NET으로는이 작업을 수행 할 수 없다는 것을 확신합니다. 저수준 호출을 사용해야합니다. 이. – Kolky

+1

너 자신이 이것을 왜 쓰고 싶은지? 이미 시장에서 그렇게 많은 유틸리티가 있습니다. 그리고 BTW는 단지 기존 섹터에 0을 쓰는 것으로 파일을 완전히 지우지는 못합니다 - 일부 소프트웨어는 여전히 데이터의 일부를 검색 할 수 있습니다. –

+0

사용자 모드에서 물리 섹터에 쓸 수 없으며 커널 모드 드라이버가 필요합니다. –

답변

6

커널 모드 드라이버를 작성하는 경우에도 불행히도 C#과 C/C++에서 완전히 불가능하지 않습니다. 개별 파일을 파쇄 Bleachbit documentation:

에서

견적이 제대로 위치가 완전히 알 수있다 가정하지만, 기본적으로는 하나 개의 이상적인를 했더 이상적인 경우에서 알 수있는 세 가지 특징이 있습니다

  1. 편집으로 인해 파일 크기가 줄어들지 않았습니다. 3MB 스프레드 시트로 시작하여 스프레드 시트 응용 프로그램을 사용하여 1MB로 편집하고 클리너 응용 프로그램에 1MB 버전 삭제를 요청하면 클리너는 누락 된 2MB가 실제 하드 드라이브에 할당 된 위치를 알 수 없습니다 . (파일 시스템은 종종 파일을 연속적으로 저장하지 않으므로 누락 된 부분이 알려진 부분 바로 뒤에 있다고 가정 할 수 없습니다.)
  2. 파일이 절대로 이동하지 않았습니다. 스프레드 시트 소프트웨어가 새 복사본을 임시 파일에 쓰고 오래된 복사본을 삭제 한 다음 임시 파일의 이름을 원래 이름으로 변경하여 문서를 저장한다고 가정 해보십시오. 이 경우 클리너 응용 프로그램은 이전 스프레드 시트의 위치를 ​​알 수 없습니다.
  3. 파일 시스템이 파일을 동일한 위치에 겹쳐 씁니다. 이것은 좋은 가정입니다. Windows NTFS 및 Linux에서 가장 일반적인 ext3 구성 (우분투 9.10 및 기타 Linux 배포판의 기본값)은 동일한 위치에서 파일을 덮어 씁니다.하지만 투명 디스크 압축, 암호화 및 스파 스 파일은 파일을 덮어 쓸 수 없습니다.

는 또한 : 현대 하드 드라이브의 영역이 손상되면 자동으로 여분의 불량 섹터를 다시 매핑. 이러한 작업은 드라이브의 펌웨어의 재량에 달려 있으며 운영 체제 나 응용 프로그램에서 해당 작업을 인식하지 못하므로 드라이브를 닦으면 손상된 영역을 무시합니다.

그렇다고해서 드라이브의 어느 섹터를 의 현재이 차지하고 있는지 파악하는 것은 (쉬운 일은 아니지만) 가능합니다. 그러나 이것은 응용 프로그램이 적어도 부분적으로 사용되는 파일 시스템을 이해하고 그 파일 시스템이 파일을 기본 매체에 저장하는 방법을 요구합니다.

마지막으로, 파일이 차지하는 모든 섹터를 식별하고 0s로 채우면 어떤 보안을 얻을 수 있는지에 대한 의문점이 남아 있습니다.그냥하는 것

using(var fs = new System.IO.FileStream(@"m:\delme.zip", 
             FileMode.Open, 
             FileAccess.Write, 
             FileShare.None)) 
{ 
    var zeros = new byte[fs.Length]; 

    fs.Write(zeros, 0, zeros.Length);  
} 
+0

좋은 생각. 나는 상자 밖으로 생각하는 방법을 좋아한다! 감사. – Frank

+0

칭찬에 감사드립니다. =) – afrischke

0

나는 이것을 할 수 있을지 확신하지 못합니다. This에 따르면 관리되지 않는 코드 만 사용할 수 있습니다.

1

일반적으로 .NET API는 없습니다. 디스크에서 FS 구조를 수동으로 읽고 파일 할당 구조를 구문 분석하고 interop을 사용하여 저레벨 블록 IO로 이동하려는 경우가 대부분입니다.

파일의 길이를 변경하고 어떤 일이 발생하는지 관찰하지 않고 파일에 0을 쓰려고 할 수 있습니다. 파일이 다시 할당되지 않을 가능성이 있습니다. 나는 그것이 사실인지 알지 못한다. OS, OS 버전, FS에 달려 있고 아마도 SSD와 HDD간에 차이가 있을지도 모른다.

또한 파쇄하려는 파일이 최근에 OS에 의해 재 할당 된 경우를 생각해보십시오. 파일에 사용 된 영역 중 일부는 이제 "비어 있음"으로 표시되지만 데이터는 그대로 남아 있습니다. 실제로 디스크 전체를 "파쇄"하지 않고 이러한 영역이 무엇인지 파악할 수있는 방법은 거의 없습니다.

또한 우리 사이의 편집증에 대해 파일 영역에 0을 쓰거나 쓰레기를 쓰는 것은 이전 데이터를 복구 할 수 없음을 보장하지 않습니다. 드라이브를 물리적으로 파괴하면 트릭을 할 수는 있지만 API는 없습니다.)

+0

답장을 보내 주셔서 감사합니다. 왜 그것이 보장되지 않는지 궁금합니다. 공간이 두 개의 데이터를 저장할 수 있습니까? – Frank

+1

@Feng HDD는 기본적으로 전기적으로 충전 된 금속 조각입니다. 당신은 해체 된 하드 드라이브의 잔여 충전량을 읽을 수 있고 그것을 반복적으로 덮어 쓰더라도 (값 비싼 기계 및 기술, OFC) 데이터를 재구성 할 수 있습니다. – Alex

관련 문제