ファイルの読み書き

ファイルの読み書きインターフェースを使用すると、デバイスとの間でファイルのアップロードやダウンロードを簡単に行え、大容量ファイルの転送にも対応します。このインターフェースでファイルをローカルやメモリにダウンロードしたり、メモリやローカルのファイルをデバイスにアップロードしたりできます。さらに、ファイルの削除、パーミッションの変更、ファイル情報の取得といった機能も備えています。
なお、ファイルが存在しない場合やアクセス権限がない場合は、OSErrorFileNotFoundError といったネイティブの Python 例外が発生します。

ローカルへのファイルダウンロード

このインターフェースでは、デバイス上のファイルをローカルにダウンロードできます。以下の例では、デバイス上のファイル /verity_key の内容を、ローカル PC の my_file.txt にダウンロードしています。ダウンロードしたファイルには、元のパーミッション情報は保持されませんので注意してください。

d.download_file("/verity_key", "my_file.txt")
>>> 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
>>> result = d.download_file("/adb_keys", "my_file.txt")
>>> print(result.st_mtime)
1230768000
>>> os.chmod("my_file.txt", result.st_mode)

メモリへのファイルダウンロード

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

from io import BytesIO
fd = BytesIO()

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

ファイルディスクリプタへのダウンロード

このインターフェースでは、デバイス上のファイルをファイルディスクリプタにダウンロードできます。ファイルはバイナリモード wb で開く必要があります。

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

デバイスへのファイルアップロード

このインターフェースでは、ローカルのファイルをデバイスにアップロードできます。次の例では、ローカルの テストファイル.txt をデバイスの /data/local/tmp/file.txt にアップロードしています。アップロード時も、元のパーミッション情報は保持されません。

d.upload_file("テストファイル.txt", "/data/local/tmp/file.txt")
>>> d.upload_file("file.txt", "/data/local/tmp/file.txt")
name: "file.txt"
path: "/data/local/tmp/file.txt"
st_mode: 33184
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
>>> result = d.upload_file("file.txt", "/data/local/tmp/file.txt")
>>> print(result.st_size)
0

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

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

from io import BytesIO
d.upload_fd(BytesIO(b"fileContent"), "/data/local/tmp/file.txt")

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

以下の例では、ローカルの myfile.txt の内容をファイルディスクリプタ fd を通じてデバイスの /data/local/tmp/file.txt にアップロードしています。ローカルファイルはバイナリモード rb で開く必要があります。

fd = open("myfile.txt", "rb")
d.upload_fd(fd, "/data/local/tmp/file.txt")

デバイスファイルの削除

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

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

ファイルパーミッションの変更

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

d.file_chmod("/data/local/tmp/file.txt", mode=0o777)
>>> d.file_chmod("/data/local/tmp/file.txt", mode=0o777)
name: "file.txt"
path: "/data/local/tmp/file.txt"
st_mode: 33279
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
>>> result = d.file_chmod("/data/local/tmp/file.txt", mode=0o777)
>>> print(oct(result.st_mode))
0o100777

ファイル情報の取得

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

d.file_stat("/data/local/tmp/file.txt")
>>> d.file_stat("/data/local/tmp/file.txt")
name: "file.txt"
path: "/data/local/tmp/file.txt"
st_mode: 33279
st_atime: 1230768000
st_mtime: 1230768000
st_ctime: 1230768000
>>> result = d.file_stat("/data/local/tmp/file.txt")
>>> print(result.name)
'file.txt'