---
title: ファイルシステム操作
---

import { TabItem, Tabs } from '@astrojs/starlight/components'

Daytona（サンドボックスという隔離されたクラウド開発環境を作成・管理するプラットフォーム）のSDKは、サンドボックス（Daytonaが管理する隔離された一時的な実行環境）内の`fs`モジュールを通じて、充実したファイルシステム操作機能を提供します。本ガイドでは、利用可能なすべてのファイルシステム操作とベストプラクティスについて説明します。

## 基本操作

Daytona SDK は、サンドボックス（Daytonaが管理する隔離された一時的な実行環境）内のファイルシステムとやり取りする機能を提供します。ファイルの一覧表示、ディレクトリ作成、ファイルの読み書きなど、さまざまな操作を実行できます。

簡潔さのため、ファイル操作はデフォルトでサンドボックスユーザーのホームディレクトリ直下で行われる前提です。例えば、`workspace` は `/home/[username]/workspace` を意味します。先頭にスラッシュ `/` を付けた絶対パスを作業ディレクトリとして指定することも可能です。

### ファイルとディレクトリの一覧表示

Daytona SDK は、Python と TypeScript を用いてサンドボックス内のファイルやディレクトリを一覧表示できます。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python
# List files in a directory
files = 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}")

```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript
// List files in a directory
const 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}`)
})
```

</TabItem>
</Tabs>

### ディレクトリの作成

Daytona SDK は、Python と TypeScript で特定のパーミッションを指定してディレクトリを作成できます。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python
# Create with specific permissions
sandbox.fs.create_folder("workspace/new-dir", "755")
```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript
// Create with specific permissions
await sandbox.fs.createFolder("workspace/new-dir", "755")
```

</TabItem>
</Tabs>

### ファイルのアップロード

Daytona SDK は、Python と TypeScript を用いて、サンドボックス内でのファイルの読み取り、書き込み、アップロード、ダウンロード、削除を行うための機能を提供します。

#### 単一ファイルのアップロード

単一ファイルをアップロードする場合は、次のように実行します。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python
# Upload a single file
with open("local_file.txt", "rb") as f:
    content = f.read()
sandbox.fs.upload_file(content, "remote_file.txt")
```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript
// Upload a single file
const fileContent = Buffer.from('Hello, World!')
await sandbox.fs.uploadFile(fileContent, "data.txt")
```

</TabItem>
</Tabs>

#### 複数ファイルのアップロード

以下は、1回のメソッド呼び出しで複数ファイルを効率的にアップロードする例です。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python
# Upload multiple files at once
files_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)

```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript
// Upload multiple files at once
const 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)
```

</TabItem>
</Tabs>

### ファイルのダウンロード

次のコマンドは、サンドボックスユーザーのホームディレクトリから `file1.txt` をダウンロードし、その内容を出力します。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python

content = sandbox.fs.download_file("file1.txt")

with open("local_file.txt", "wb") as f:
    f.write(content)

print(content.decode('utf-8'))

```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript

const downloadedFile = await sandbox.fs.downloadFile("file1.txt")

console.log('File content:', downloadedFile.toString())

```

</TabItem>
</Tabs>

### ファイルの削除

不要になったファイルは、`delete_file` 関数で削除できます。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python

sandbox.fs.delete_file("workspace/file.txt")

```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript

await sandbox.fs.deleteFile("workspace/file.txt")
```

</TabItem>
</Tabs>

## 高度な操作

Daytona SDK は、ファイル権限の設定・取得、検索と置換などの高度なファイルシステム操作を提供します。

### ファイル権限

Daytona SDK では、Python と TypeScript から、ファイル権限の設定・取得や、ディレクトリ権限の再帰的な設定が行えます。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python
# Set file permissions
sandbox.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}")

```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript
// Set file permissions
await sandbox.fs.setFilePermissions("workspace/file.txt", { mode: "644" })

// Get file permissions
const fileInfo = await sandbox.fs.getFileDetails("workspace/file.txt")
console.log(`Permissions: ${fileInfo.permissions}`)
```

</TabItem>
</Tabs>

### ファイルの検索と置換

Daytona SDK では、Python と TypeScript から、ファイル内のテキストの検索および置換を行えます。

<Tabs syncKey="language">
<TabItem label="Python" icon="seti:python">
```python
# Search for text in files; if a folder is specified, the search is recursive
results = 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"
)

```
</TabItem>
<TabItem label="TypeScript" icon="seti:typescript">
```typescript
// Search for text in files; if a folder is specified, the search is recursive
const 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 files
await sandbox.fs.replaceInFiles(
    ["workspace/file1.txt", "workspace/file2.txt"],
    "old_text",
    "new_text"
)
```

</TabItem>
</Tabs>
