# การอ่านและเขียนไฟล์บนอุปกรณ์

อินเทอร์เฟซการอ่านและเขียนไฟล์ช่วยให้คุณสามารถอัปโหลดหรือดาวน์โหลดไฟล์จากอุปกรณ์ได้อย่างง่ายดาย รองรับการดาวน์โหลดและอัปโหลดไฟล์ขนาดใหญ่ คุณสามารถใช้อินเทอร์เฟซที่เกี่ยวข้องเพื่อดาวน์โหลดไฟล์ไปยังเครื่องคอมพิวเตอร์ของคุณ (local) หรือหน่วยความจำ (memory) และอัปโหลดไฟล์จากหน่วยความจำหรือเครื่องคอมพิวเตอร์ของคุณไปยังอุปกรณ์ได้ นอกจากนี้ยังรวมถึงฟังก์ชันต่างๆ เช่น การลบไฟล์ การแก้ไขสิทธิ์ของไฟล์ และการดึงข้อมูลไฟล์
สำหรับการดำเนินการกับไฟล์ที่ไม่มีอยู่จริงหรือไม่ได้รับอนุญาต การเรียกใช้จะทำให้เกิด Python exception **แบบดั้งเดิม** เช่น `OSError` หรือ `FileNotFoundError`

## ดาวน์โหลดไฟล์ลงในเครื่องคอมพิวเตอร์ (Local)

อินเทอร์เฟซนี้สามารถดาวน์โหลดไฟล์จากอุปกรณ์ลงในเครื่องคอมพิวเตอร์ของคุณได้ ในตัวอย่างด้านล่างนี้ เนื้อหาของไฟล์ `/verity_key` บนอุปกรณ์จะถูกดาวน์โหลดไปยังไฟล์ `my_file.txt` บนคอมพิวเตอร์ปัจจุบัน โปรดทราบว่าไฟล์ที่ดาวน์โหลดจะไม่คงข้อมูลสิทธิ์ (permission) เดิมไว้

```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)
```

## ดาวน์โหลดไฟล์ไปยังหน่วยความจำ (Memory)

อินเทอร์เฟซนี้สามารถดาวน์โหลดไฟล์จากอุปกรณ์ไปยังหน่วยความจำได้ (ผ่าน BytesIO)

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

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


## ดาวน์โหลดไฟล์ไปยัง File Descriptor

อินเทอร์เฟซนี้สามารถดาวน์โหลดไฟล์จากอุปกรณ์ไปยัง file descriptor ได้ โปรดทราบว่าไฟล์จำเป็นต้องเปิดในโหมดไบนารี `wb`

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

## อัปโหลดไฟล์ไปยังอุปกรณ์

อินเทอร์เฟซนี้สามารถอัปโหลดไฟล์จากเครื่องคอมพิวเตอร์ของคุณไปยังอุปกรณ์ได้ ในตัวอย่างนี้ หมายถึงการอัปโหลดไฟล์ `测试文件.txt` จากเครื่องคอมพิวเตอร์ไปยังไฟล์ `/data/usr/file.txt` บนอุปกรณ์ การอัปโหลดไฟล์จะไม่คงข้อมูลสิทธิ์ (permission) เดิมไว้เช่นกัน

```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")
```

## อัปโหลดไฟล์จาก File Descriptor

ตัวอย่างต่อไปนี้จะอัปโหลดเนื้อหาของไฟล์ `myfile.txt` จากเครื่องคอมพิวเตอร์ผ่าน fd (file descriptor) ไปยังไฟล์ `/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'
```