File System Operations
The Daytona SDK provides comprehensive file system operations through the fs
module in Sandboxes. This guide covers all available file system operations and best practices.
Basic Operations
Daytona SDK provides an option to interact with the file system in Sandboxes. You can perform various operations like listing files, creating directories, reading and writing files, and more.
File operations assume you are operating in the Sandbox user’s home directory (e.g. workspace
implies /home/[username]/workspace
). Use a leading /
when providing absolute paths.
Listing Files and Directories
Daytona SDK provides an option to list files and directories in a Sandbox using Python and TypeScript.
# List files in a directoryfiles = sandbox.fs.list_files("workspace")
for file in files: print(f"Name: {file.name}") print(f"Is directory: {file.is_dir}") print(f"Size: {file.size}") print(f"Modified: {file.mod_time}")
// List files in a directoryconst files = await sandbox.fs.listFiles("workspace")
files.forEach(file => { console.log(`Name: ${file.name}`) console.log(`Is directory: ${file.isDir}`) console.log(`Size: ${file.size}`) console.log(`Modified: ${file.modTime}`)})
See: list_files (Python SDK), listFiles (TypeScript SDK)
Creating Directories
Daytona SDK provides an option to create directories with specific permissions using Python and TypeScript.
# Create with specific permissionssandbox.fs.create_folder("workspace/new-dir", "755")
// Create with specific permissionsawait sandbox.fs.createFolder("workspace/new-dir", "755")
See: create_folder (Python SDK), createFolder (TypeScript SDK)
Uploading Files
Daytona SDK provides options to read, write, upload, download, and delete files in Sandboxes using Python and TypeScript.
Uploading a Single File
The following example shows how to upload a single file:
# Upload a single filewith open("local_file.txt", "rb") as f: content = f.read()sandbox.fs.upload_file(content, "remote_file.txt")
// Upload a single fileconst fileContent = Buffer.from('Hello, World!')await sandbox.fs.uploadFile(fileContent, "data.txt")
See: upload_file (Python SDK), uploadFile (TypeScript SDK)
Uploading Multiple Files
The following example shows how to efficiently upload multiple files with a single method call.
# Upload multiple files at oncefiles_to_upload = []
with open("file1.txt", "rb") as f1: files_to_upload.append(FileUpload( source=f1.read(), destination="data/file1.txt", ))
with open("file2.txt", "rb") as f2: files_to_upload.append(FileUpload( source=f2.read(), destination="data/file2.txt", ))
with open("settings.json", "rb") as f3: files_to_upload.append(FileUpload( source=f3.read(), destination="config/settings.json", ))
sandbox.fs.upload_files(files_to_upload)
// Upload multiple files at onceconst files = [ { source: Buffer.from('Content of file 1'), destination: 'data/file1.txt', }, { source: Buffer.from('Content of file 2'), destination: 'data/file2.txt', }, { source: Buffer.from('{"key": "value"}'), destination: 'config/settings.json', }]
await sandbox.fs.uploadFiles(files)
See: upload_files (Python SDK), uploadFiles (TypeScript SDK)
Downloading Files
Downloading a Single File
The following commands downloads a single file file1.txt
from the Sandbox working directory and prints out the content:
content = sandbox.fs.download_file("file1.txt")
with open("local_file.txt", "wb") as f: f.write(content)
print(content.decode('utf-8'))
const downloadedFile = await sandbox.fs.downloadFile("file1.txt")
console.log('File content:', downloadedFile.toString())
See: download_file (Python SDK), downloadFile (TypeScript SDK)
Downloading Multiple Files
The following example shows how to efficiently download multiple files with a single method call.
# Download multiple files at oncefiles_to_download = [ FileDownloadRequest(source="data/file1.txt"), # No destination - download to memory FileDownloadRequest(source="data/file2.txt", destination="local_file2.txt"), # Download to local file]
results = sandbox.fs.download_files(files_to_download)
for result in results: if result.error: print(f"Error downloading {result.source}: {result.error}") elif result.result: print(f"Downloaded {result.source} to {result.result}")
// Download multiple files at onceconst files = [ { source: "data/file1.txt" }, // No destination - download to memory { source: "data/file2.txt", destination: "local_file2.txt" }, // Download to local file]
const results = await sandbox.fs.downloadFiles(files)
results.forEach(result => { if (result.error) { console.error(`Error downloading ${result.source}: ${result.error}`) } else if (result.result) { console.log(`Downloaded ${result.source} to ${result.result}`) }})
See: download_files (Python SDK), downloadFiles (TypeScript SDK)
Deleting files
The following example shows how to delete a file:
sandbox.fs.delete_file("workspace/file.txt")
await sandbox.fs.deleteFile("workspace/file.txt")
See: delete_file (Python SDK), deleteFile (TypeScript SDK)
Advanced Operations
Daytona SDK provides advanced file system operations like file permissions, search and replace, and more.
File Permissions
Daytona SDK provides an option to set file permissions, get file permissions, and set directory permissions recursively using Python and TypeScript.
# Set file permissionssandbox.fs.set_file_permissions("workspace/file.txt", "644")
# Get file permissions
file_info = sandbox.fs.get_file_info("workspace/file.txt")print(f"Permissions: {file_info.permissions}")
// Set file permissionsawait sandbox.fs.setFilePermissions("workspace/file.txt", { mode: "644" })
// Get file permissionsconst fileInfo = await sandbox.fs.getFileDetails("workspace/file.txt")console.log(`Permissions: ${fileInfo.permissions}`)
See: set_file_permissions (Python SDK), setFilePermissions (TypeScript SDK)
File Search and Replace
Daytona SDK provides an option to search for text in files and replace text in files using Python and TypeScript.
# Search for text in files; if a folder is specified, the search is recursiveresults = sandbox.fs.find_files( path="workspace/src", pattern="text-of-interest")for match in results: print(f"Absolute file path: {match.file}") print(f"Line number: {match.line}") print(f"Line content: {match.content}") print("\n")
# Replace text in files
sandbox.fs.replace_in_files( files=["workspace/file1.txt", "workspace/file2.txt"], pattern="old_text", new_value="new_text")
// Search for text in files; if a folder is specified, the search is recursiveconst results = await sandbox.fs.findFiles({ path="workspace/src", pattern: "text-of-interest"})results.forEach(match => { console.log('Absolute file path:', match.file) console.log('Line number:', match.line) console.log('Line content:', match.content)})
// Replace text in filesawait sandbox.fs.replaceInFiles( ["workspace/file1.txt", "workspace/file2.txt"], "old_text", "new_text")
See: find_files (Python SDK), replace_in_files (Python SDK), findFiles (TypeScript SDK), replaceInFiles (TypeScript SDK)