-
Notifications
You must be signed in to change notification settings - Fork 56
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Kindle 2024 でファイル転送できない #438
Comments
ドライブレターを割り当てるツールとスクリプトについてgistにあげてます。参考までに。 MTPプロトコルを扱うrubyのライブラリを見つける事ができませんでした。 |
情報ありがとうございます。今の所narou.rbの設定で"convert.copy-to"を指定して、格納されたファイルを手動でエクスプローラー上のKindleのdocumentsフォルダーにコピーすることで暫定運用していますが、コピー時に大量のファイルを一度にコピーするとエラーになるので何回かに分けてコピーするなどしており、MTPでのマウントは今一つ信頼性に欠けるという認識です。 |
Note 下記の Shell.Application を使う方法は駄目そう。 Kindle 2024 がないので動作確認できませんが、エクスプローラのPCの下に表示されるデバイス名が Kindle のみの場合は、以下で Kindle デバイスの検出とファイルのコピーはできそうです。 require 'win32ole'
SHELL_APPLICATION = WIN32OLE.new("Shell.Application")
def get_device_root_dir(volume_name)
volume = SHELL_APPLICATION.NameSpace(0x11).Items.each.select do |item|
name = item.Name
name = $` if name =~ / \([A-Z]:\)$/ # ドライブレターがあったら削除
name.casecmp(volume_name) == 0
end.first
volume ? volume.Path.gsub('\\', '/') : nil
end
def copy_file(src_file, dest_directory)
dest = SHELL_APPLICATION.NameSpace(dest_directory.gsub('/', '\\'))
# マジックナンバー16でファイルが存在するとき上書き
# 参照: https://learn.microsoft.com/ja-jp/windows/win32/shell/folder-copyhere
dest.CopyHere(src_file.gsub('/', '\\'), 16)
end
def file_exist?(filename)
dir, file = File.split(filename)
begin
folder = SHELL_APPLICATION.NameSpace(dir.gsub('/', '\\'))
rescue WIN32OLE::RuntimeError
return false
end
folder && folder.Items.each.any? do |item|
item.Name == file
end
end
def file_mtime(filename)
dir, file = File.split(filename)
folder = SHELL_APPLICATION.NameSpace(dir.gsub('/', '\\'))
return nil if folder.nil?
item = folder.Items.each.find do |item|
item.Name == file
end
return nil if item.nil?
item.ModifyDate
end
def is_directory?(filename)
begin
SHELL_APPLICATION.NameSpace(filename.gsub('/', '\\'))
true
rescue WIN32OLE::RuntimeError
false
end
end
file_name = 'documentsの下にコピーするローカルディスクのファイル名'
kindle_device = get_device_root_dir('Kindle')
documents_dir = File.join(kindle_device, 'documents')
copy_file(File.absolute_path(file_name), documents_dir)
理想的には 問題点:
普段、Windows を使ってないので、ここまで。 |
kuboさんのスクリプトを試してみました。 実際のデバイス名とフォルダー構成は私の場合
に変更し、テストファイルのコピーを試したところ、copy_fileはエラーなしで呼べたのですが、ダイアログは出ずにコピーもされませんでした。 一例なので、何か環境依存があるかどうかまでは調べられていません。 |
動作確認ありがとうございます。 Shell.Application をWIN32OLEで使う方式はどうやら駄目そうですね……。 |
Kindle2024からPC接続時のファイル転送はMTPプロトコルが使われるようになり、KindleをPCにUSBケーブルで接続してもドライブレターが割り当てられなくなったため、narou.rbからKindleが接続されたことを検知できず、Sendコマンドが使えなくなりました。
The text was updated successfully, but these errors were encountered: