Mubifiles

Notes ·

How to open a .001 file

A .001 file is one slice of a larger file. Here is how to tell a raw byte split from a multi-volume archive — they look identical from the filenames and need completely different handling — and how to put either back together.

A .001 file is one slice of a bigger file that was cut into numbered pieces. Join the pieces back in order and you get the original — a video, a ZIP, an installer — which then opens like anything else.

On macOS or Linux, one command does it:

cat movie.mkv.??? > movie.mkv

On Windows:

copy /b movie.mkv.001+movie.mkv.002+movie.mkv.003 movie.mkv

The ??? glob is safe because the numbers are zero-padded to a fixed width, so the shell expands them in the right order. Do not use a wildcard with copy /b — it orders by directory order rather than by name, which is usually the same thing and occasionally silently is not.

That works for nearly every .001 set, including the ones 7-Zip produces. There is one shape it does not work for, which takes ten seconds to rule out.

Check which kind you have

Almost everything numbered .001is a raw byte split: a file cut at fixed offsets with nothing added. That includes 7-Zip’s own volume option, which is worth saying because people assume an archive tool must have wrapped something. It does not — we joined a 7z a -v1m set with plain cat and the result passed 7z tand extracted to the original file’s digest.

The exception is a ZIP written by zip -s. Its first volume opens with a four-byte spanning marker, and concatenating the volumes shifts every offset recorded inside the archive by those four bytes. Those sets are normally named .z01 / .z02 / .zip rather than .001, so you are unlikely to meet one here — but if the names have been changed along the way, this is the case to catch.

A true multi-volume RAR is a separate thing again, and it announces itself in the name: .part1.rar, .part2.rar. Open the first one with 7-Zip or WinRAR and it finds the rest itself.

Look at the first bytes. Any Unix machine can do this without installing anything:

$ od -A n -t x1z -N 8 volz.zip.001 # 7-Zip ZIP volumes 50 4b 03 04 0a 00 00 00 >PK......< joins fine $ od -A n -t x1z -N 8 vol.7z.001 # 7-Zip .7z volumes 37 7a bc af 27 1c 00 04 >7z..'...< joins fine $ od -A n -t x1z -N 8 span.z01 # zip -s spanned archive 50 4b 07 08 50 4b 03 04 >PK..PK..< does NOT join

Those are real files, made with 7z and zip and read back with od. Note the last one: 50 4b 07 08 is the spanning marker, and it is the onlyone of these that means “do not concatenate”. Here is what happens if you ignore it — three tools, three different reactions:

$ cat span.z01 span.z02 span.zip > catspan.zip 7-Zip ERROR = Missing volume : catspan.z01 python zipfile opens, and testzip() reports payload.bin corrupt unzip bad zipfile offset (local header sig), exit 2, then re-compensates and extracts anyway

Which brings up the advice you will find everywhere else, and which is wrong: “if part 001 starts with PK, it is an archive, so do not join it”. Splitting a ZIP is the single most common reason a .001file exists, and 7-Zip’s own volumes start with PK too. Follow that rule and you refuse the join that works.

A signature in part 001 tells you what the original file was. Apart from that one four-byte marker, it does not tell you how the pieces were made.

Order, and the way it fails

Sorting by filename is correct only while the numbering stays the same width. A set running past .999 into .1000 sorts wrongly by name, and so does anything from a tool that did not pad — .1, .2, .10 sorts as .1, .10, .2.

The output is then exactly the right size and completely wrong, with no error anywhere. We broke the sort in our own joiner to see what a user would actually get from a 24-part, 600 MB set:

unsorted 629145600 bytes d2fdbc04f3743db61f664ec8fe3f501130f20d8c42a350647e044498e59c506e sorted 629145600 bytes c4255503e1da1cf183273999ea8e9e393f71587fe9e75425b8bfaa4d11c6cb7e

Same size, different file. If a part is missing entirely you get the same silence, which is why the joiner here refuses and names the gap instead of writing anything.

Joining in a browser, and where that breaks

The limitation first, because it decides whether this is worth your time: only Chrome and Edge on a computer can stream the result to disk. In Firefox and Safari the whole joined file has to be built in memory before it can be handed to you, so a set adding up to more than a few gigabytes will fail there. That is not our choice — the File System Access API does not exist in those browsers yet.

It is also why most browser-based joiners fall over on large sets: they build the output in memory as a matter of design, so they stop working somewhere below the size of your RAM — which is unfortunate, because files big enough to be split are exactly the ones this matters for.

Measured on the same 300 MB of parts, through the same harness, our streaming join against a conventional in-memory one:

streaming to disk grew 70 MB (0.23× the payload) built in memory grew 360 MB (1.20× the payload)

Pushed further, with the whole browser confined to a hard 2 GB memory cap and a 4 GB file: the streaming join finished in 147 seconds with a digest matching the source, and the in-memory version killed the renderer after 464 seconds.

What I would actually do

If you have a terminal, use cat. It is one line, it is instant, and there is no tool between you and your file.

If you are on Windows without a terminal habit, or you would rather see the parts checked before anything is written, the joiner on this site does it in the browser — it sorts numerically, refuses a set with a gap, and tells you what you are holding before it writes anything. Nothing is uploaded.

If the names are .part1.rar or .z01, do not join anything. Put the volumes in one folder and open the first .rar — or the .zip — with 7-Zip, which finds the others itself.

The tool this is about

Everything described here runs in your browser, on your own device, with nothing uploaded.

Open the file joiner

Or send the whole thing to another device

Mubifiles moves files and text between two devices with a six-digit code. No account, nothing to install.

Start a session →