20

複数のユーザーが複数のコンピューターで実行することを意図したスクリプトがありますが、それぞれのホーム ディレクトリにすべての Dropbox フォルダーがあるわけではありません。スクリプトでパスをハードコーディングする必要はありません。プログラムでパスを見つけたいと思います。

どんな提案でも大歓迎です。

編集: スクリプトで Dropbox API を使用していません。スクリプトは、ユーザー間で共有されている特定の Dropbox フォルダー内のファイルを読み取るだけです。もちろん、Dropbox ファイル構造内の相対パスは既にわかっているので、必要なのは Dropbox フォルダへのパスだけです。

編集:問題があれば、私は Windows 7 を使用しています。

4

8 に答える 8

16

ここで答えを見つけました。sの 2 行目に等しく設定し、~\AppData\Roaming\Dropbox\host.dbそれを base64 でデコードするとパスが得られます。

def _get_appdata_path():
    import ctypes
    from ctypes import wintypes, windll
    CSIDL_APPDATA = 26
    _SHGetFolderPath = windll.shell32.SHGetFolderPathW
    _SHGetFolderPath.argtypes = [wintypes.HWND,
                                 ctypes.c_int,
                                 wintypes.HANDLE,
                                 wintypes.DWORD,
                                 wintypes.LPCWSTR]
    path_buf = wintypes.create_unicode_buffer(wintypes.MAX_PATH)
    result = _SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, path_buf)
    return path_buf.value

def dropbox_home():
    from platform import system
    import base64
    import os.path
    _system = system()
    if _system in ('Windows', 'cli'):
        host_db_path = os.path.join(_get_appdata_path(),
                                    'Dropbox',
                                    'host.db')
    elif _system in ('Linux', 'Darwin'):
        host_db_path = os.path.expanduser('~'
                                          '/.dropbox'
                                          '/host.db')
    else:
        raise RuntimeError('Unknown system={}'
                           .format(_system))
    if not os.path.exists(host_db_path):
        raise RuntimeError("Config path={} doesn't exists"
                           .format(host_db_path))
    with open(host_db_path, 'r') as f:
        data = f.read().split()

    return base64.b64decode(data[1])
于 2012-08-25T00:54:23.467 に答える
1

を使用してファイルシステムを検索できますos.walkDropboxフォルダはおそらくユーザーのホームディレクトリ内にあるので、時間を節約するために検索をそれに限定することができます。例:

import os
dropbox_folder = None

for dirname, dirnames, filenames in os.walk(os.path.expanduser('~')):
    for subdirname in dirnames:
        if(subdirname == 'Dropbox'):
            dropbox_folder = os.path.join(dirname, subdirname)
            break
    if dropbox_folder:
        break

# dropbox_folder now contains the full path to the Dropbox folder, or
# None if the folder wasn't found

または、Dropboxフォルダーの場所をユーザーに求めるか、構成ファイルを使用して構成可能にすることもできます。

于 2012-08-25T00:43:32.263 に答える
0

.dropbox.cache1つのオプションは、Dropboxディレクトリ内の隠しフォルダであるディレクトリ(少なくともMacとLinuxでは)を検索することです。

Dropboxがその設定を暗号化されたコンテナーに格納することはかなり確信している.dbxので、Dropboxが使用するのと同じ方法を使用してそれを抽出することは簡単ではありません。

于 2012-08-25T00:45:52.597 に答える