As leppie was saying, it's just a file with offsets - your typical archive type file. You could have a structure as the first blob in the file like so:
public struct Header
{
public int count;
public FileHeader[] headers;
}
public struct FileHeader
{
public string Filename;
public long Offset;
public long Length;
}
You fill the Header structure with information, such as how many files are in the archive and an array that represents each file. You can provide a filename (might as well) and a byte offset to where that file is found. You can get a lot more advanced than this, and even this basic example wouldn't work as well as many others out there. Basically, though, you take that offset (either from the beginning of the file (offset 0) or from the end of the Header (offset == size of Header, including the array of FileHeaders), and start reading a byte array from that Offset until Length bytes has been read. There is no standard way of doing this, but I do remember seeing a couple of articles about archives here on CP. You could try googling for keywords such as archive, header, and other stuff I've used here. leppie might have some other suggestions.
-----BEGIN GEEK CODE BLOCK----- Version: 3.21 GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++ -----END GEEK CODE BLOCK-----