前提・実現したいこと
Pythonを用いたファイルのバックアップ用のプログラムを作成しています。
tkinter を GUI として使い、エクスプローラーを通してファイルのパスを取得、
shutill の copy2 を用いてファイルのバックアップをしています。
発生している問題・エラーメッセージ
tkinter経由でエクスプローラーを起動したとき、Androidが表示されない
(通常のエクスプローラーでは表示される)
また、Androidのディレクトリを指定して実行してもコピーされない(エラーメッセージはなし)
該当のソースコード
Python
1import pathlib 2import os 3import shutil 4 5class ReadFile(): 6 def __init__(self, path: str) -> None: 7 """指定されたディレクトリに含まれるすべてのファイルとディレクトリを再帰的に取得する 8 9 Args: 10 path (str): ディレクトリのパス、絶対パス 11 """ 12 self.path = path 13 self.file = pathlib.Path(self.path) 14 self.files = [] 15 self.directories = [] 16 self.read() 17 18 def read(self) -> None: 19 self.files = [(i, i.stat().st_mtime) 20 for i in self.file.glob('**/*') if i.is_file()] 21 self.directories = [i for i in self.file.glob('**') if i.is_dir()] 22 23 24class MoveFile(): 25 def __init__(self, start: str, end: str) -> None: 26 """バックアップをする。 27 28 ディレクトリが存在するかどうかを判定してから、 29 ファイルの変更日時を比較してファイルのバックアップをする。 30 31 Args: 32 start (str): _description_ 33 end (str): _description_ 34 """ 35 self.start = ReadFile(start) 36 self.end = ReadFile(end) 37 38 self.enddic = {str(i[0]).replace(self.end.path, ''): i[1] for i in self.end.files} 39 40 self.enddirs = {str(i).replace(self.end.path, '') 41 for i in self.end.directories} # endのdirectoryのset 42 self.move() 43 44 def move(self): 45 for i in self.start.directories: 46 os.makedirs(self.end.path + 47 str(i).replace(self.start.path, ''), exist_ok=True) 48 for ip, f in self.start.files: 49 ip = str(ip).replace(self.start.path, '') 50 if ip not in self.enddic: 51 shutil.copy2(self.start.path + ip, self.end.path + ip) 52 elif f > self.enddic[ip]: 53 shutil.copy2(self.start.path + ip, self.end.path + ip)
このプログラムをGUIのプログラムに読み込ませてWindows上で実行しています。
また、GUIの方ではtkinter.filedialogを使っています。
調べたこと
違うディレクトリを指定すると正しく動いたので、このプログラムが悪いわけではなさそう。
コピー先、コピー元のディレクトリには同名のファイルやディレクトリは存在しなかった。
PythonのWindowsにおけるファイルへのアクセス権限あたりを調べてみたが、少なくともすべてのファイルに対して権限があることがわかった(正しいかどうかはわからない)
Android側の設定等をいじれば行けそうだが、Androidに対する知識がないのでわからなかった。
補足情報(FW/ツールのバージョンなど)
PCのOS:Windows 10
Python3.10.1
スマホのOS:Android バージョン11
スマホのモデル名:Galaxy A41

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/08 07:12