2011-10-27 4 views
2

이미지 텍스트 파일 및 다른 것들과 같은 많은 데이터가있는 작은 프로젝트로 바쁘다. 하나의 큰 파일이나 여러 개의 큰 파일로 모두 압축하려고하므로 프로그램 폴더 지저분 해 보이지 않습니다.큰 바이너리 파일 편집

하지만 문제는 어떻게 이러한 파일을 편집 할 수 있는가입니다. 나는 파일 구조에 대해 생각했습니다 그리고는 다음과 같이 될 것 :

 
[DWORD] Number of files 

    [DWORD]FileId 
    [STRING]FileName 
    [DWORD]FileSize 
    [DWORD]FileIndex 

[BYTES]All the files 

그래서 첫 번째 부분입니다 너무 빨리 모든 파일의 목록을 얻을과의 FileIndex 바이너리 파일의 위치입니다 그래서 예를 들어 포인터를 300으로 설정하고 파일을 읽을 수 있습니다.

패치를 만들고 편집하려면 편집중인 파일 다음에있는 모든 바이트를 읽어야하며 모든 파일을 복사하여 몇 개의 파일로 보관할 수 있습니다.

모든 파일을 삽입하면 바이너리 파일이 100MB 정도 될 수 있습니다.

다른 프로그램에서는 어떻게 이런 큰 파일을 사용하고 여분의 바이트를 더 빨리 삽입 할 수있는 트릭이 있습니까?

+3

호기심에서 벗어나 누가 프로그램 디렉토리를보고 거칠게 보일 것입니까? 일반적으로 사람들은 프로그램의 디렉토리를 신경 쓸 필요가 없습니다. –

+0

네 말이 맞아.하지만 난 프로그래밍 기술을 향상시키고 다른 일을 시도하고있어. 지금은 파일 시스템으로 일하고있어. 나 혼자서 그걸 알아낼 수 있었어. – Kevin

답변

0

바이트를 설명 된 파일 이외의 파일로 삽입 할 수 없습니다. 이것은 프로그래밍 언어와 독립적입니다. 파일 시스템이 어떻게 작동하는지 ...

은 파일 수를 덮어 쓸 수 있지만 바이트 수를 고려하는 한.

1

당신은 사용자 정의 메모리 할당과 같은 종류의 포장 및 편집 프로그램을 치료할 수 :

  1. 는 최소 블록 크기를 사용하여 - 당신이 파일을 추가 할 때 파일을 맞게 충분히 전체 블록을 사용합니다. 이렇게하면 다른 파일에 영향을 미치지 않고 파일을 자동으로 확장하여 방을 확장 할 수 있습니다.
  2. 파일이 현재 할당에 비해 너무 커지면 패키지의 끝으로 파일을 이동하십시오.
  3. 여유 공간이있는 블록을 표시하고 패키지 헤더의 무료 목록 헤드에 오프셋을 유지하십시오. 다른 파일을 추가 할 때 먼저 자유 블록이 충분한 지 확인하십시오.
  4. 파일을 현재 블록에서 확장 할 때 다음 블록이 사용 가능 목록에 있는지 확인하십시오.
  5. 무료 목록이 너무 길어지면 (너무 많은 단편화) 패키지를 정리하십시오. 각 파일을 앞으로 이동하여 첫 번째 빈 블록에서 시작하십시오. 이렇게하면 전체 파일을 다시 써야하지만 드물게 발생합니다.

대신에 간단한 디렉토리 대신 FAT과 같은 것을 사용하십시오. 각 파일에 대해 청크 및 크기 목록을 저장하십시오. 현재 할당보다 파일을 확장 할 때 나머지와 함께 다른 청크를 추가하십시오. 필요한 경우 조각 모음을 수행합니다.

이 두 가지 모두 패키지에 약간의 오버 헤드를 추가하지만 실제로 간격을 벗어나는 것은 모든 삽입물에 전체를 다시 쓰는 유일한 대안입니다.

+0

그건 아주 대략적으로, FAT의 작동 원리. – littleadv

+0

또한 공간을 절약하기 위해 파일 자체를 조각 냈습니다. –

3

파일 중간에 바이트를 삽입하는 데 "트릭"이 없습니다.

는 일반적으로 솔루션은 다음 인덱스에서의 위치를 ​​전환, 파일의 끝에 파일을 추가 포함한다. 그런 다음 파일을 조각 모음해야하는 문제가 발생합니다. 조각 모음 문제를 완화 할 수있는 큰 덩어리로 파일을 분할 할 수 있지만 연속 된 파일은 아닙니다. 당신이 절대적으로 필요하지 않는 한

이 아닌 정적 데이터를 처리하는 경우, 나는이 일을 권하고 싶지 않다. 나는 절대적으로 뛰어난 소프트웨어 엔지니어가 합리적인 구현을 작성하는 데 상당한 시간을 소비하는 것을 보았습니다. 가상 파일 시스템으로 sqlite가 사용

이에 대한 실행 가능한 해결책이 될 수 있습니다. 그러나 다시 한번, 데이터 파일을 다른 폴더에 넣어서 "지저분 해"보이지 않도록하십시오.

1

트릭은 데이터를 덮어 써서 패치를 만드는 것입니다. 그렇지 않으면 많은 양의 데이터 (예 : 데이터베이스)를 관리 할 수있는 시스템이 있습니다.

당신은 당신의 프로그램을 동반 데이터베이스 파일을 생성하고,이 모든 데이터를 보유, 그리고 파일에 있습니다. 예를 들어 SQLite과 같이 응용 프로그램에 데이터베이스 코드를 포함 시키거나 Sql Server, Oracle SQL 또는 MySql과 같은 외부 DB를 사용할 수도 있습니다.

당신이 설명하는 것은 기본적으로 자신의 파일 시스템을 구현하는 것입니다. 그 효과를 내기위한 까다 롭고 어려운 일입니다.

0

.zip 파일 사용에 대해 생각해 보셨습니까? 여러 개의 파일이 하나로 저장되어있는 형식을 계속보고 있으며 기본 파일은 실제로 zip 파일입니다. 이것에 대한 좋은 점은 zip 라이브러리가 하위 수준의 비트 추적 내용을 처리한다는 것입니다.

마음에 와서 몇 가지 예

: -

  • 단어 .DOCX 파일은 정말 우편 (그것의 전체 폴더가 .zip으로 하나의 이름을 변경하고, 당신이 그것을 열 수)입니다
  • Silverlight 패키지에서 사용하는 .xap 파일은 다른 파일입니다. 가능한 모든의 경우
+0

자바의'.jar' 파일은 Zip 프로그램으로 열리지 만, 내가 보지 못했던 기술적으로는별로 없습니다. –

3

, 나는 아마 zip 파일로 최대의 데이터를 패키지 것입니다. 이렇게하면 디렉토리를 정리할뿐만 아니라 (특히 텍스트 파일의 경우) 압축을 기본적으로 무료로 제공합니다. 물론 zip 파일을 생성, 검사, 수정하는 등의 기존 도구와 라이브러리도 많이 있습니다.

예를 들어 zlib을 사용하면 대부분의 작업이 처리됩니다 (예 : minizip).

0

당신은 메모리 매핑 된 파일에서 지원하는 관리되는 공유 메모리를 사용할 수 있습니다. 전체 파일에 대해 충분한 주소 공간이 있어야하지만 전체 파일을 메모리로 복사 할 필요는 없습니다. 공유 메모리 할당자를 사용하여 대부분의 표준 기능을 사용할 수 있지만 어디에서나 사용자 정의 할당자를 지정하는 것이 어려움이라는 것을 빠르게 알 수 있습니다. 그러나 좋은 소식은 여러분이 스스로 구현할 필요가 없다는 것입니다. Boost.Interprocess을 취할 수 있으며 이미 유닉스와 윈도우 모두에 필요한 모든 기능을 갖추고 있습니다.