# デバイスファイルの読み書き

ファイル読み書きインターフェースを使用すると、デバイスからファイルを簡単にアップロードまたはダウンロードできます。大きなファイルのダウンロードとアップロードをサポートしており、関連するインターフェースを使用してファイルをローカルまたはメモリにダウンロードしたり、メモリまたはローカルのファイルをデバイスにアップロードしたりできます。また、ファイルの削除、ファイル権限の変更、ファイル情報の取得などの機能も含まれています。
存在しない、または権限のないファイルを操作しようとすると、`OSError`や`FileNotFoundError`のような**ネイティブ**なPython例外が発生します。

## ファイルをローカルにダウンロード

このインターフェースは、デバイス上のファイルをローカルにダウンロードできます。以下の例では、デバイス上のファイル `/verity_key` の内容を、現在のコンピュータの `my_file.txt` ファイルにダウンロードします。ダウンロードされたファイルは元の権限情報を保持しないことに注意してください。

```python
d.download_file("/verity_key", "my_file.txt")
```

```python
>>> d.download_file("/adb_keys", "my_file.txt")
name: "adb_keys"
path: "/adb_keys"
st_mode: 33188
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
st_size: 2202
```

```python
>>> result = d.download_file("/adb_keys", "my_file.txt")
>>> print (result.st_mtime)
1230768000
>>> os.chmod("my_file.txt", result.st_mode)
```

## ファイルをメモリにダウンロード

このインターフェースは、デバイス上のファイルをメモリにダウンロードできます（BytesIOを使用）。

```python
from io import BytesIO
fd = BytesIO()

d.download_fd("/verity_key", fd)
print (fd.getvalue())
```


## ファイルをディスクリプタにダウンロード

このインターフェースは、デバイス上のファイルをファイルディスクリプタにダウンロードできます。ファイルは `wb` バイナリモードで開く必要があることに注意してください。

```python
fd = open("my_file.txt", "wb")
d.download_fd("/verity_key", fd)
```

## ファイルをデバイスにアップロード

このインターフェースは、ローカルのファイルをデバイスにアップロードできます。例では、ローカルの `测试文件.txt` をデバイスの `/data/usr/file.txt` ファイルにアップロードすることを意味します。アップロードされたファイルも元の権限情報を保持しません。

```python
d.upload_file("测试文件.txt", "/data/usr/file.txt")
```

```python
>>> d.upload_file("file.txt", "/data/usr/file.txt")
name: "file.txt"
path: "/data/usr/file.txt"
st_mode: 33184
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
```

```python
>>> result = d.upload_file("file.txt", "/data/usr/file.txt")
>>> print (result.st_size)
0
```

## メモリからファイルをアップロード

以下の例では、メモリ内のファイル内容をBytesIO経由でデバイスの `/data/usr/file.txt` ファイルにアップロードします。

```python
from io import BytesIO
d.upload_fd(BytesIO(b"fileContent"), "/data/usr/file.txt")
```

## ディスクリプタからファイルをアップロード

以下の例では、ローカルファイル `myfile.txt` の内容をfdディスクリプタ経由でデバイスの `/data/usr/file.txt` ファイルにアップロードします。ローカルファイルは `rb` バイナリモードで開く必要があることに注意してください。

```python
fd = open("myfile.txt", "rb")
d.upload_fd(fd, "/data/usr/file.txt")
```

## デバイスファイルを削除

このインターフェースは、デバイス上のファイルを削除するために使用します。

```python
d.delete_file("/data/usr/file.txt")
```

```python
>>> d.delete_file("/data/usr/file.txt")
True
```

```python
>>> d.delete_file("/adb_keys")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
OSError: [Errno 30] Read-only file system
```

## ファイル権限の変更

このインターフェースは、デバイス上のファイルの権限を変更するために使用します。

```python
d.file_chmod("/data/usr/file.txt", mode=0o777)
```

```python
>>> d.file_chmod("/data/usr/file.txt", mode=0o777)
name: "file.txt"
path: "/data/usr/file.txt"
st_mode: 33279
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
```

```python
>>> result = d.file_chmod("/data/usr/file.txt", mode=0o777)
>>> print (oct(result.st_mode))
0o100777
```

## ファイル情報の取得

このインターフェースは、デバイス上のファイルに関する情報を取得するために使用します。

```python
d.file_stat("/data/usr/file.txt")
```

```python
>>> d.file_stat("/data/usr/file.txt")
name: "file.txt"
path: "/data/usr/file.txt"
st_mode: 33279
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
```

```python
>>> result = d.file_stat("/data/usr/file.txt")
>>> print (result.name)
'file.txt'
```