10

最初の:私はpyinotifyを知っています。

私が欲しいのは、Dropboxを使用したホームサーバーへのアップロードサービスです。

ホームサーバーにDropboxの共有フォルダーがあります。そのフォルダーを共有している他の誰かがそのフォルダーに何かを入れるたびに、ホームサーバーが完全にアップロードされるまで待機し、すべてのファイルを別のフォルダーに移動し、それらのファイルをDropboxフォルダーから削除して、Dropboxを保存するようにします。スペース。

ここで重要なのは、フォルダの変更を追跡してすぐにファイルを移動することはできないということです。誰かが大きなファイルをアップロードすると、Dropboxはすでにダウンロードを開始し、ホームサーバー上のフォルダの変更を表示するからです。

いくつかの回避策はありますか?Dropbox APIでそれはどういうわけか可能ですか?

自分で試したことはありませんが、 DropboxCLIバージョンには現在のファイルステータスを確認するための「filestatus」メソッドがあるようです。自分で試してみたら報告します。

4

3 に答える 3

2

質問で述べたように、PythonドロップボックスCLIクライアントがあります。ファイルをアクティブに処理していない場合は、「アイドル...」を返します。あなたが望むものを達成するために私が想像できる最も単純なメカニズムは、コンテンツの出力をチェックしdropbox.py filestatus /home/directory/to/watchてscpを実行し、それが成功した場合はコンテンツを削除するwhileループです。それから5分ほど寝ました。

何かのようなもの:

import time
from subprocess import check_call, check_output
DIR = "/directory/to/watch/"
REMOTE_DIR = "user@my_server.com:/folder"

While True:
    if check_output(["dropbox.py", "status", DIR]) == "\nIdle...":
        if check_call(["scp", "-r", DIR + "*", REMOTE_DIR]):
            check_call(["rm", "-rf", DIR + "*"])
    time.sleep(360)

もちろん、このようなものをテストするときは非常に注意が必要です。2番目のcheck_callに間違ったものを入れると、ファイルシステムが失われる可能性があります。

于 2012-09-11T20:52:39.953 に答える
1

incrondを実行して、Dropboxフォルダー内のIN_CLOSE_WRITEイベントを待機させることができます。その後、ファイル転送が完了したときにのみトリガーされます。

于 2012-09-11T22:02:49.147 に答える
1

これは、Dropboxがアイドル状態になるのを待たないRubyバージョンであるため、同期中に実際にファイルの移動を開始できます。また、とを無視...ます。実際には、特定のディレクトリ内の各ファイルのファイルステータスをチェックします。

次に、このスクリプトをcronジョブとして、または別の画面で実行します。

directory = "path/to/dir"
destination = "location/to/move/to"

Dir.foreach(directory) do |item|
    next if item == '.' or item == '..'
    fileStatus = `~/bin/dropbox.py filestatus #{directory + "/" + item}`
    puts "processing " + item
    if (fileStatus.include? "up to date")
        puts item + " is up to date, starting to move file now."
        # cp command here. Something along this line: `cp #{directory + "/" + item + destination}`
        # rm command here. Probably you want to confirm that all copied files are correct by comparing md5 or something similar.
    else
        puts item + " is not up to date, moving on to next file."
    end
end

これは完全なスクリプトであり、最終的には次のようになりました。

# runs in Ruby 1.8.x (ftools)

require 'ftools'

directory = "path/to/dir"
destination = "location/to/move/to"

Dir.glob(directory+"/**/*") do |item|
    next if item == '.' or item == '..'
    fileStatus = `~/bin/dropbox.py filestatus #{item}`
    puts "processing " + item
    puts "filestatus: " + fileStatus
    if (fileStatus.include? "up to date")
        puts item.split('/',2)[1] + " is up to date, starting to move file now."
        `cp -r #{item + " " + destination + "/" + item.split('/',2)[1]}`

        # remove file in Dropbox folder, if current item is not a directory and 
        # copied file is identical.
        if (!File.directory?(item) && File.cmp(item, destination + "/" + item.split('/',2)[1]).to_s)
            puts "remove " + item
            `rm -rf #{item}`
        end
    else
        puts item + " is not up to date, moving to next file."
    end
end
于 2012-09-12T11:15:43.520 に答える