VSCode extensions operate in a heterogeneous environment that can
include local files, remote workspaces, virtual file systems, and cloud
storage. The Uri class abstracts this complexity and
provides a unified interface for all resource types. Unlike string-based
paths common in Java, a Uri encapsulates scheme, authority,
and path in an immutable object. This abstraction allows extensions to
work seamlessly across local and remote environments without requiring
the developer to account for the underlying differences. Every file,
workspace, or resource operation in VSCode uses Uri objects
as the primary identification interface.
The choice of the correct creation method determines which types of
resources you can address. Uri.file() is designed
exclusively for local file system paths and automatically creates
file:// URIs with proper platform handling. This method
accepts only absolute paths and automatically converts Windows
backslashes into URI-compliant forward slashes.
Uri.parse(), on the other hand, processes arbitrary URI
strings and supports various schemes such as http://,
vscode:// or untitled:.
// Local files: Uri.file() for known absolute paths
const lokaleDatei = vscode.Uri.file('/home/user/projekt/config.json');
// Generic URIs: Uri.parse() for schema-dependent resources
const remoteRessource = vscode.Uri.parse('http://example.com/api/data');
const vscodeUri = vscode.Uri.parse('vscode://settings/user');
const unbenannteeDatei = vscode.Uri.parse('untitled:Untitled-1');For workspace-relative paths, you should always use
Uri.joinPath() as this method automatically respects the
workspace’s base URI and works cross-platform.
A Uri object is divided into several components that
represent different aspects of resource identification. Understanding
this structure is essential for correctly interpreting and manipulating
URIs.
| Property | Example Value | Usage |
|---|---|---|
scheme |
file, http, vscode |
Determines resource type and access protocol |
authority |
localhost:8080, github.com |
Server or host information for remote resources |
path |
/workspace/src/main.ts |
Normalized path with forward slashes |
fsPath |
C:\workspace\src\main.ts |
Platform-specific file system path (only for
file://) |
fragment |
line=42 |
Anchor or position within the resource |
query |
encoding=utf8&mode=readonly |
Parameters for resource access |
const beispielUri = vscode.Uri.parse('file:///c:/projekt/src/main.ts#line=15');
console.log(`Schema: ${beispielUri.scheme}`); // "file"
console.log(`Path: ${beispielUri.path}`); // "/c:/projekt/src/main.ts"
console.log(`File system: ${beispielUri.fsPath}`); // "c:\projekt\src\main.ts" (Windows)
console.log(`Fragment: ${beispielUri.fragment}`); // "line=15"The fsPath property is available only for
file:// URIs and provides the string path usable on the
local file system. For all other schemes, fsPath is empty
or undefined.
URIs serve as the central data structure for all file and resource-related operations in VSCode. The most important use cases include file access, editor control, and workspace navigation.
async function demonstriereUriVerwendung(): Promise<void> {
const workspaceFolder = vscode.workspace.workspaceFolders?.[0];
if (!workspaceFolder) return;
// Open file programmatically
const configUri = vscode.Uri.joinPath(workspaceFolder.uri, 'package.json');
const document = await vscode.workspace.openTextDocument(configUri);
await vscode.window.showTextDocument(document);
// Read and write file
const datenUri = vscode.Uri.joinPath(workspaceFolder.uri, 'data.txt');
const inhalt = 'Beispielinhalt mit UTF-8: äöü';
await vscode.workspace.fs.writeFile(datenUri, new TextEncoder().encode(inhalt));
// TreeItem with URI for Explorer integration
const treeItem = new vscode.TreeItem('Konfiguration', vscode.TreeItemCollapsibleState.None);
treeItem.resourceUri = configUri;
treeItem.command = { command: 'vscode.open', title: 'Open', arguments: [configUri] };
}These usage patterns show how URIs act as a consistent interface between different VSCode APIs and enable uniform resource handling.
URI comparisons require special attention because JavaScript object references cannot be used for content equality. VSCode offers several methods for URI serialization and comparison, which differ depending on the use case.
function vergleicheUris(): void {
const uri1 = vscode.Uri.file('/pfad/zur/datei.txt');
const uri2 = vscode.Uri.file('/pfad/zur/datei.txt');
// WRONG: Reference comparison does not work
console.log(uri1 === uri2); // false, although content is equal
// CORRECT: String comparison for equality
console.log(uri1.toString() === uri2.toString()); // true
// Serialization for storage or transmission
const serialisiert = uri1.toJSON();
const deserialisiert = vscode.Uri.revive(serialisiert);
// URL encoding consideration for special characters
const leerzeichenUri = vscode.Uri.file('/pfad mit leerzeichen/datei.txt');
console.log(leerzeichenUri.toString(true)); // Fully encoded
console.log(leerzeichenUri.toString(false)); // Minimally encoded for display
}The method toString(true) generates fully URL-encoded
strings, while toString(false) produces a user-friendly
representation with minimal encoding.
The most common mistake is unsafe use of fsPath for
non-file URIs or assuming that all URIs represent local files. Always
validate the scheme before accessing file-system-specific properties.
Use Uri.joinPath() for all path-related operations instead
of string concatenation. Always compare URIs via the
toString() methods, never via reference comparison. For
paths containing spaces or special characters, consistently use URI APIs
instead of manual string manipulation. For URI persistence, use
toJSON() and Uri.revive() to correctly retain
schema information and encoding. Note that remote workspaces may not
provide an fsPath property and may require alternative
access via the workspace FS API.