# Чтение и запись файлов устройства

Интерфейсы для чтения и записи файлов позволяют легко загружать файлы с устройства или на устройство. Поддерживается загрузка и выгрузка больших файлов. Вы можете использовать соответствующие интерфейсы для загрузки файлов на локальный компьютер или в память, а также для выгрузки файлов из памяти или с локального компьютера на устройство. Также доступны функции удаления файлов, изменения прав доступа к файлам и получения информации о файлах.
При попытке выполнить операцию с несуществующим файлом или файлом, к которому нет доступа, вызов вызовет **нативное** исключение Python, такое как `OSError` или `FileNotFoundError`.

## Скачивание файла на локальный компьютер

Этот интерфейс позволяет скачивать файлы с устройства на локальный компьютер. В приведенном ниже примере содержимое файла `/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
```

## Загрузка файла из памяти

В следующем примере содержимое файла из памяти загружается на устройство в файл `/data/usr/file.txt` с помощью BytesIO.

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

## Загрузка файла из дескриптора

В следующем примере содержимое локального файла `myfile.txt` загружается на устройство в файл `/data/usr/file.txt` через файловый дескриптор fd. Обратите внимание, что локальный файл должен быть открыт в двоичном режиме `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'
```