Theia filesystem extension providing comprehensive file operations, tree widgets, dialogs, and file system integration for IDE environments.
—
Unified file service providing high-level file operations, encoding handling, streaming I/O, and event coordination across multiple file system providers. Acts as the central integration point for all file operations in Theia applications.
Central service coordinating file operations across multiple providers with encoding handling, streaming, and event management.
/**
* Unified API for all file system operations
*/
interface FileService {
/** Map of registered file system providers by scheme */
readonly providers: Map<string, FileSystemProvider>;
/** Register a file system provider for a URI scheme */
registerProvider(scheme: string, provider: FileSystemProvider): Disposable;
/** Get provider for a specific URI */
getProvider(resource: URI): FileSystemProvider | undefined;
/** Check if a provider exists for the URI scheme */
hasProvider(resource: URI): boolean;
/** Check provider capabilities for a resource */
hasCapability(resource: URI, capability: FileSystemProviderCapabilities): boolean;
/** Read file with automatic encoding detection and handling */
readFile(resource: URI, options?: ReadEncodingOptions): Promise<FileContent>;
/** Read file as stream with encoding handling */
readFileStream(resource: URI, options?: ReadEncodingOptions): Promise<FileStreamContent>;
/** Write file with encoding handling */
writeFile(resource: URI, content: string | Uint8Array, options?: WriteFileOptions): Promise<FileStat>;
/** Get file statistics */
stat(resource: URI): Promise<FileStat>;
/** List directory contents */
readdir(resource: URI): Promise<FileStat[]>;
/** Create directory */
createFolder(resource: URI): Promise<FileStat>;
/** Delete file or directory */
delete(resource: URI, options?: DeleteFileOptions): Promise<void>;
/** Move/rename file or directory */
move(source: URI, target: URI, options?: MoveFileOptions): Promise<FileStat>;
/** Copy file or directory */
copy(source: URI, target: URI, options?: CopyFileOptions): Promise<FileStat>;
/** File system change events */
readonly onDidFilesChange: Event<FileChangesEvent>;
/** File operation events */
readonly onDidRunFileOperation: Event<FileOperationEvent>;
/** Provider registration events */
readonly onDidChangeFileSystemProviderRegistrations: Event<FileSystemProviderRegistrationEvent>;
}Specialized operations for text files with encoding detection and handling.
/**
* Text file content with encoding information
*/
interface TextFileContent {
/** File resource URI */
readonly resource: URI;
/** Text content as string */
readonly value: string;
/** Character encoding used */
readonly encoding: string;
/** File statistics */
readonly stat: FileStat;
/** Version information */
readonly version: FileResourceVersion;
}
/**
* Streaming text file content
*/
interface TextFileStreamContent {
/** File resource URI */
readonly resource: URI;
/** Text content as readable stream */
readonly value: ReadableStream<string>;
/** Character encoding used */
readonly encoding: string;
/** File statistics */
readonly stat: FileStat;
/** Version information */
readonly version: FileResourceVersion;
}
/**
* Read text file with encoding options
*/
interface ReadTextFileOptions extends ReadEncodingOptions {
/** Accept text files over this size with confirmation */
acceptTextOnly?: boolean;
/** Maximum file size to read */
limits?: {
/** Maximum file size in bytes */
size?: number;
};
}Comprehensive options for various file operations including overwrite behavior, encoding, and formatting.
/**
* Options for reading files with encoding
*/
interface ReadEncodingOptions {
/** Override encoding detection */
encoding?: string;
/** Whether to auto-detect encoding */
autoGuessEncoding?: boolean;
}
/**
* Options for writing files
*/
interface WriteFileOptions extends WriteEncodingOptions {
/** Create file if it doesn't exist */
create?: boolean;
/** Overwrite existing file */
overwrite?: boolean;
/** Unlock readonly files */
unlock?: boolean;
/** Atomic write operation */
atomic?: boolean;
}
/**
* Encoding options for writing
*/
interface WriteEncodingOptions {
/** Character encoding to use */
encoding?: string;
/** Write BOM for UTF encodings */
writeBOM?: boolean;
}
/**
* Options for deleting files/directories
*/
interface DeleteFileOptions {
/** Delete recursively for directories */
recursive?: boolean;
/** Move to trash instead of permanent deletion */
useTrash?: boolean;
/** Skip confirmation dialogs */
skipConfirm?: boolean;
}
/**
* Options for moving/renaming files
*/
interface MoveFileOptions {
/** Overwrite existing target */
overwrite?: boolean;
/** Skip confirmation dialogs */
skipConfirm?: boolean;
}
/**
* Options for copying files
*/
interface CopyFileOptions {
/** Overwrite existing target */
overwrite?: boolean;
/** Skip confirmation dialogs */
skipConfirm?: boolean;
/** Preserve original timestamps */
preserveTimestamps?: boolean;
}Extension mechanism allowing other services to participate in file operations for validation, transformation, or logging.
/**
* Participant in file operations for validation or transformation
*/
interface FileOperationParticipant {
/** Participate in file operation before execution */
participate(
files: SourceTargetPair[],
operation: FileOperation,
timeout: number,
token: CancellationToken
): Promise<void>;
}
/**
* Source and target pair for file operations
*/
interface SourceTargetPair {
/** Source file URI */
source?: URI;
/** Target file URI */
target: URI;
}
/**
* Register file operation participant
*/
function registerFileOperationParticipant(participant: FileOperationParticipant): Disposable;Events for tracking file system provider registration and changes.
/**
* File system provider registration event
*/
interface FileSystemProviderRegistrationEvent {
/** URI scheme being registered/unregistered */
readonly scheme: string;
/** Provider instance (undefined for unregistration) */
readonly provider?: FileSystemProvider;
/** Whether this is a registration or unregistration */
readonly added: boolean;
}Specialized high-level operations for text files with encoding detection, content updates, and streaming support.
/**
* Extended file service interface with text file operations
*/
interface FileService {
/** Read text file with encoding detection and handling */
readTextContent(resource: URI, options?: ReadTextFileOptions): Promise<TextFileContent>;
/** Read text file as stream with encoding handling */
readTextContentStream(resource: URI, options?: ReadTextFileOptions): Promise<TextFileStreamContent>;
/** Write text content to file with encoding */
writeTextContent(resource: URI, content: string, options?: WriteTextFileOptions): Promise<FileStatWithMetadata & { encoding: string }>;
/** Create new text file with content */
createTextFile(resource: URI, content?: string, options?: CreateTextFileOptions): Promise<FileStatWithMetadata>;
/** Update text file with incremental changes */
updateTextFile(resource: URI, changes: TextDocumentContentChangeEvent[], options: UpdateTextFileOptions): Promise<FileStatWithMetadata & { encoding: string }>;
}
/**
* Text file content with encoding information
*/
interface TextFileContent extends BaseStatWithMetadata {
/** Text content of the file */
readonly value: string;
/** Character encoding used */
readonly encoding: string;
}
/**
* Streaming text file content
*/
interface TextFileStreamContent extends BaseStatWithMetadata {
/** Text content as readable stream */
readonly value: ReadableStream<string>;
/** Character encoding used */
readonly encoding: string;
}
/**
* Text file operation specific error
*/
class TextFileOperationError extends FileOperationError {
constructor(
message: string,
public textFileOperationResult: TextFileOperationResult,
options?: ReadTextFileOptions & WriteTextFileOptions
);
}
enum TextFileOperationResult {
FILE_IS_BINARY
}
/**
* Options for text file operations
*/
interface ReadTextFileOptions extends ReadEncodingOptions, ReadFileOptions {
/** Accept text files only, fail if binary */
acceptTextOnly?: boolean;
}
interface CreateTextFileOptions extends WriteEncodingOptions, CreateFileOptions {}
interface WriteTextFileOptions extends WriteEncodingOptions, WriteFileOptions {}
interface UpdateTextFileOptions extends WriteEncodingOptions, WriteFileOptions {
/** Encoding used when reading the file */
readEncoding: string;
}
interface WriteEncodingOptions {
/** Encoding to use when writing */
encoding?: string;
/** Enforce encoding without BOM detection */
overwriteEncoding?: boolean;
}Service for uploading files from client to server with progress tracking and drag-and-drop support.
/**
* File upload service with progress tracking
*/
interface FileUploadService {
/** Event fired when files are uploaded */
readonly onDidUpload: Event<string[]>;
/** Maximum concurrent uploads allowed */
readonly maxConcurrentUploads: number;
/** Upload files to target location */
upload(targetUri: string | URI, params?: FileUploadParams): Promise<FileUploadResult>;
}
/**
* File upload parameters and options
*/
interface FileUploadParams {
/** Source data (drag-and-drop or file input) */
source?: DataTransfer | CustomDataTransfer;
/** Progress tracking options */
progress?: FileUploadProgressParams;
/** Callback when upload completes */
onDidUpload?: (uri: string) => void;
/** Keep files in temporary directory */
leaveInTemp?: boolean;
}
interface FileUploadProgressParams {
/** Progress display text */
text: string;
}
interface FileUploadResult {
/** Array of uploaded file URIs */
uploaded: string[];
}
/**
* Upload endpoint and URL constants
*/
const HTTP_FILE_UPLOAD_PATH = '/file-upload';
const HTTP_UPLOAD_URL: string;Service for downloading files and directories with compression and link copying support.
/**
* File download service
*/
interface FileDownloadService {
/** Download files or directories */
download(uris: URI[], options?: DownloadOptions): Promise<void>;
/** Cancel ongoing download */
cancelDownload(id: string): Promise<void>;
}
/**
* Download operation options
*/
interface DownloadOptions {
/** Copy download link to clipboard instead of downloading */
readonly copyLink?: boolean;
}
/**
* Download data structure
*/
interface FileDownloadData {
/** Array of file URIs to download */
readonly uris: string[];
}Usage Examples:
import {
FileService, TextFileContent, FileUploadService,
FileDownloadService
} from "@theia/filesystem/lib/browser";
import { URI } from "@theia/core/lib/common/uri";
// Get file service instance
const fileService = container.get(FileService);
// Basic file operations
const fileUri = URI.parse('file:///workspace/readme.txt');
// Read file with encoding detection
const content = await fileService.readFile(fileUri);
console.log(`Content: ${content.value.toString()}`);
console.log(`Encoding: ${content.encoding}`);
console.log(`Size: ${content.stat.size} bytes`);
// Read file with specific encoding
const contentUtf16 = await fileService.readFile(fileUri, {
encoding: 'utf16le'
});
// Write file with encoding
await fileService.writeFile(
URI.parse('file:///workspace/output.txt'),
'Hello, World!',
{
encoding: 'utf8',
create: true,
overwrite: true
}
);
// Stream reading for large files
const streamContent = await fileService.readFileStream(fileUri);
const reader = streamContent.value.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
console.log('Chunk:', value);
}
} finally {
reader.releaseLock();
}
// Directory operations
const dirUri = URI.parse('file:///workspace/src');
// List directory contents
const entries = await fileService.readdir(dirUri);
for (const entry of entries) {
console.log(`${entry.name}: ${entry.isFile ? 'file' : 'directory'}`);
}
// Create directory
const newDirUri = URI.parse('file:///workspace/new-folder');
await fileService.createFolder(newDirUri);
// File operations
const sourceUri = URI.parse('file:///workspace/source.txt');
const targetUri = URI.parse('file:///workspace/target.txt');
// Copy file
await fileService.copy(sourceUri, targetUri, {
overwrite: true,
preserveTimestamps: true
});
// Move/rename file
await fileService.move(sourceUri, URI.parse('file:///workspace/renamed.txt'), {
overwrite: false
});
// Delete file
await fileService.delete(targetUri, {
useTrash: true
});
// Event handling
fileService.onDidFilesChange(event => {
console.log(`${event.changes.length} files changed`);
for (const change of event.changes) {
console.log(`${FileChangeType[change.type]}: ${change.resource.toString()}`);
}
});
fileService.onDidRunFileOperation(event => {
console.log(`Operation: ${FileOperation[event.operation]}`);
console.log(`Target: ${event.target.toString()}`);
if (event.source) {
console.log(`Source: ${event.source.toString()}`);
}
});
// Provider management
const customProvider = new CustomFileSystemProvider();
const disposable = fileService.registerProvider('custom', customProvider);
// Check provider capabilities
const hasWriteCapability = fileService.hasCapability(
URI.parse('custom://example'),
FileSystemProviderCapabilities.FileReadWrite
);
// Get specific provider
const provider = fileService.getProvider(URI.parse('file:///example'));
if (provider) {
// Direct provider operations
const stat = await provider.stat(URI.parse('file:///example'));
}
// Cleanup
disposable.dispose();// Custom file operation participant
class ValidationParticipant implements FileOperationParticipant {
async participate(
files: SourceTargetPair[],
operation: FileOperation,
timeout: number,
token: CancellationToken
): Promise<void> {
for (const { source, target } of files) {
// Validate operation
if (operation === FileOperation.DELETE && target.path.includes('important')) {
throw new Error('Cannot delete important files');
}
// Transform paths
if (operation === FileOperation.CREATE && source) {
// Custom logic for file creation
}
}
}
}
// Register participant
const participant = new ValidationParticipant();
const disposable = registerFileOperationParticipant(participant);
// Batch operations
const files = [
URI.parse('file:///file1.txt'),
URI.parse('file:///file2.txt'),
URI.parse('file:///file3.txt')
];
// Read multiple files in parallel
const contents = await Promise.all(
files.map(uri => fileService.readFile(uri))
);
// Write multiple files with same options
const writeOptions = { encoding: 'utf8', create: true };
await Promise.all(
contents.map((content, index) =>
fileService.writeFile(
URI.parse(`file:///output${index}.txt`),
content.value.toString().toUpperCase(),
writeOptions
)
)
);
// Complex file operations with error handling
async function safeFileOperation(uri: URI) {
try {
// Check if provider exists
if (!fileService.hasProvider(uri)) {
throw new Error(`No provider for scheme: ${uri.scheme}`);
}
// Check capabilities
if (!fileService.hasCapability(uri, FileSystemProviderCapabilities.FileReadWrite)) {
throw new Error('Provider does not support read/write operations');
}
// Perform operation
const content = await fileService.readFile(uri);
return content;
} catch (error) {
console.error(`File operation failed for ${uri.toString()}:`, error);
throw error;
}
}Install with Tessl CLI
npx tessl i tessl/npm-theia--filesystem