2012-12-22 4 views
2

크기 블록으로 파일을 구성하여 파일을 만들려고합니다. 근본적으로 나는 기본적인 파일 시스템을 만들려고합니다.파일에 특정 바이트 수를 쓰거나 읽는 방법

헤더와 동일한 크기/구조의 "무제한"가능한 수의 항목을 작성해야합니다. 중요한 부분은 다음과 같습니다

데이터의 각 블록이 필요
  • 이/쓰기를 읽을 수
      개별적으로
    • 헤더는이 데이터를 저장 할 수있는 방법을 필요로 자신의 실체
    • 로/읽기 쓰기 권한을 설정해야 파일의 위치를 ​​결정하는 신속

    등 뭔가 닮은 것 파일 상상 :

    [HEADER][DATA1][DATA2][DATA3][...] 
    

    이와 같은 것을 처리하는 올바른 방법은 무엇입니까? 파일에서 DATA3을 읽으 려한다고 가정 할 때 데이터 청크가 시작되는 위치를 어떻게 알 수 있습니까?

  • +0

    음. 모든 항목의 크기가 같은 경우 왜 수식을 사용하면 안되나요? 'DATA_POSITION = HEADER_SIZE + DATA_SIZE * DATA_INDEX'? –

    +0

    data_index는 설명이 필요한 부분 중 하나입니다. 데이터 청크가 저장되면 특정 데이터 청크가 저장된 위치를 어떻게 추적합니까? – jgallant

    +0

    .Net 4+에서 작업하는 경우 메모리 매핑 파일을 사용하여이를 수행 할 수 있습니다. – 48klocs

    답변

    1

    올바르게 이해하고 DATA 청크에 일종의 이름/ID를 지정해야하는 경우 다른 종류의 청크를 소개해 볼 수 있습니다.

    TOC (목차)이라고합시다. 파일 구조는 [HEADER][TOC1][DATA1][DATA2][DATA3][TOC2][...]입니다.

    TOC 청크에는 이름/ID와 복수 DATA 청크에 대한 참조가 포함됩니다. 또한 다음 TOC 청크에 대한 포인터와 같은 일부 내부 데이터가 포함됩니다 (따라서 TOC 청크를 연결된 목록 노드로 간주 할 수 있습니다).

    런타임 전혀 TOC 청크 키 DATA 청크의 이름/ID이고, 값은 파일의 위치를 ​​HashMap의 일종으로서 표현 될 수있다.

    0

    우리는 청크의 크기를 헤더에 저장할 수 있습니다. 덩어리의 크기가 가변적이면 실제 덩어리를 가리키는 포인터를 저장할 수 있습니다. 가변 크기에 대한 흥미로운 디자인은 포스트그레스 힙 파일 페이지에 있습니다. http://doxygen.postgresql.org/bufpage_8h_source.html

    0

    나는 그 반대로 일하지만 도움이 될 수 있습니다.

    이진 파일 용 디 컴파일러를 작성합니다. 일반적으로 알려진 수의 고정 된 헤더가 있습니다. 여기에는 특정 파일 식별이 포함되어있어서 우리가 다루는 파일 형식을 인식 할 수 있습니다.

    다음은 섹션 수 (데이터 그룹)를 포함하는 고정 된 바이트 수입니다.이 숫자는 데이터 포인터의 수를 알려줍니다. 각 데이터 포인터는 데이터 블록의 시작을 나타내는 네 바이트 (또는 필요한 것) 일 수 있습니다. 이를 통해 각 블록의 크기를 계산할 수 있습니다. 디 컴파일러는 한 번에 하나씩 블록을 읽어 각 데이터 블록의 파일에서 크기와 위치를 가져옵니다. 그런 다음 작업은 해당 블록을 추출하여 필요한 작업을 수행하는 것입니다.

    한 번에 한 블록 씩 파일을 탐색합니다. 마지막 블록의 크기는 파일 끝의 시작 포인터입니다.

    관련 문제