Path parts splitter
Paste /home/a/file.tar.gz and get its parts: folder /home/a, file name file.tar.gz, name file.tar, extension .gz and root /. Everything is worked out from the text alone, without touching any disk. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Path
- /home/a/file.tar.gz
- Dirname
- /home/a
- Basename
- file.tar.gz
- Stem
- file.tar
- Ext
- .gz
Split a path string into dirname, basename, stem, extension and root. Search intent: path basename dirname extension. No network calls, no random seeds, and no server state are required for a correct answer.
Five parts from one path
Take /home/a/file.tar.gz. The folder that contains the file is /home/a, the file name is file.tar.gz, the name without its last extension is file.tar, the extension is .gz and the root is /, which also makes the path absolute. The tool returns all of these at once, so you do not have to count slashes or dots by hand, and you can reuse each part on its own, for example to rename a file while keeping its folder, or to group files by extension.
Text only, never your disk
The splitting is pure text work. The tool never opens, lists or checks your file system, so it behaves the same for a path on your computer, on a server or one that does not exist yet. Nothing is sent over the network and there are no random elements or stored state, which means the same path always produces the same parts. Note that only the last extension counts: a double extension such as .tar.gz gives .gz, with file.tar left as the name.
How it works
Split a path string into dirname, basename, stem, extension and root. Pure string parsing — never touches the filesystem. The implementation is pure JavaScript with no external services.
No network calls, no random seeds, and no server state are required for a correct answer. Failed jobs are not billed. Landings target the stated search intent with precise keywords.
Prefer explicit units and ranges over silent coercion of bad types. When a field is optional, defaults are documented in params and echoed in the output. This keeps
When to use it
Use this when your search intent matches the calculator name and you need a reproducible answer for teaching, finance ops, GIS, text tooling, or unit history work. Split a path string into dirname, basename, stem, extension and root. No network calls, no random seeds, and no server state are required for a correct answer.
Failed jobs are not billed. Landings target the stated search intent with precise keywords. Prefer explicit units and ranges over silent coercion of bad types.
When a field is optional, defaults are
FAQ
Does it call the network?
No. All math and text transforms are local and deterministic.
Does it check whether the file or folder exists?
No. It analyzes the text only and never touches the file system, so it works with any path you type, even one that exists neither on your computer nor on any server.
Which extension does it report for a name like file.tar.gz?
Only the last one, .gz, leaving file.tar as the name without extension. If you need the full double extension, take it from the complete file name, which is returned as it is.
How can I tell whether a path is absolute?
The tool reports the root and whether the path is absolute. In the example, /home/a/file.tar.gz starts at the root /, so it is marked as absolute.
Does the same path always give the same parts?
Yes. There are no random elements and no stored state, so the same path produces exactly the same folder, name, extension and root every time you split it.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/path-parts \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"path":"/home/a/file.tar.gz"}'const res = await fetch("https://api.kit.forhosting.com/text/path-parts", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"path": "/home/a/file.tar.gz"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/path-parts",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"path": "/home/a/file.tar.gz"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/path-parts", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"path":"/home/a/file.tar.gz"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"path":"/home/a/file.tar.gz"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/path-parts", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"path": "/home/a/file.tar.gz"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.path_parts",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS
How it works
The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
Inputs, limits and rounding
Optional decimals use half-up once. No network calls, no random seeds, and no server state are required for a correct answer. Failed jobs are not billed. Landings target the stated search intent with precise keywords. Prefer explicit units and ranges over silent coercion of bad types. When Provide the required parameters as JSON numbers or strings as documented. Invalid types, missing required fields, or out-of-range values raise invalid_input with a clear message. Outputs echo key inputs so automation can log the full context of each call. The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
When to use it
The calculator is free in the browser, deterministic, and identical in the API path. Inputs are validated before any arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE results when decimals are requested. Use the same JSON contract from spreadsheets, CMS hooks, automation, or teaching demos.
Integration use cases
Quick check
Paste values in the free widget and compare with a spreadsheet.
Automation
Call the API with the same JSON contract from n8n, scripts, or CMS.
Teaching
Show the formula and pinned golden examples without proprietary software.
Technical questions
Is it free in the browser?
Yes. Tier A runs fully client-side with the same core as the API.
What happens on bad input?
The handler throws invalid_input; failed jobs are not billed.
Can I use it from the API?
Yes. Send the same JSON fields documented in params.
Who authors this?
Aspire (elon@forhosting.com), EN-only delivery; Nitro hydrates locales.