ファイルシステム操作
Daytona(サンドボックスという隔離されたクラウド開発環境を作成・管理するプラットフォーム)のSDKは、サンドボックス(Daytonaが管理する隔離された一時的な実行環境)内のfs
モジュールを通じて、充実したファイルシステム操作機能を提供します。本ガイドでは、利用可能なすべてのファイルシステム操作とベストプラクティスについて説明します。
基本操作
Daytona SDK は、サンドボックス(Daytonaが管理する隔離された一時的な実行環境)内のファイルシステムとやり取りする機能を提供します。ファイルの一覧表示、ディレクトリ作成、ファイルの読み書きなど、さまざまな操作を実行できます。
簡潔さのため、ファイル操作はデフォルトでサンドボックスユーザーのホームディレクトリ直下で行われる前提です。例えば、workspace
は /home/[username]/workspace
を意味します。先頭にスラッシュ /
を付けた絶対パスを作業ディレクトリとして指定することも可能です。
ファイルとディレクトリの一覧表示
Daytona SDK は、Python と 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}`)})
ディレクトリの作成
Daytona SDK は、Python と TypeScript で特定のパーミッションを指定してディレクトリを作成できます。
# Create with specific permissionssandbox.fs.create_folder("workspace/new-dir", "755")
// Create with specific permissionsawait sandbox.fs.createFolder("workspace/new-dir", "755")
ファイルのアップロード
Daytona SDK は、Python と TypeScript を用いて、サンドボックス内でのファイルの読み取り、書き込み、アップロード、ダウンロード、削除を行うための機能を提供します。
単一ファイルのアップロード
単一ファイルをアップロードする場合は、次のように実行します。
# 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")
複数ファイルのアップロード
以下は、1回のメソッド呼び出しで複数ファイルを効率的にアップロードする例です。
# 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)
ファイルのダウンロード
次のコマンドは、サンドボックスユーザーのホームディレクトリから file1.txt
をダウンロードし、その内容を出力します。
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())
ファイルの削除
不要になったファイルは、delete_file
関数で削除できます。
sandbox.fs.delete_file("workspace/file.txt")
await sandbox.fs.deleteFile("workspace/file.txt")
高度な操作
Daytona SDK は、ファイル権限の設定・取得、検索と置換などの高度なファイルシステム操作を提供します。
ファイル権限
Daytona SDK では、Python と 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}`)
ファイルの検索と置換
Daytona SDK では、Python と 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")