BitcasaAPI経由で取得できるファイルリストは、アップロードが完了したファイルのみが取得できるので
APIで取得したBitcasaのファイルリストとローカルのファイルリストを比較することにより、
アップロード忘れや不完全ファイルなどのアップロード失敗ファイルを検出する
API経由でダウンロードできるか確かめてハッシュを計算する
Visual Studio 2013のランタイムと
.NET Framework 4が必要です。
システムにインストールされていない場合は、リンクしたmicrosoftのサイトから落として入れてください。
bitcasaDiffをコマンドラインから呼び出して実行です。
>BitcasaDiff list (remotetarget)
>BitcasaDiff local (localtarget)
>BitcasaDiff diff (localtarget) (remotetarget)
Bitcasa APIの制限により、
< > : " / \ | ? *
をパスに含むファイル および 先頭がドット(.)で始まるファイル名またはパス名のファイルは検索できません。
先頭がドットのファイルはWindowsにおいて許されているので、これらのファイルは
ローカルには存在し、リモートで見つからない扱いとなります。現時点で回避方法はありません。
/hash オプションをつけてlist, diffを実行すると、Bitcasaからのダウンロードが発生します。
このとき、最大スレッド数*64MiB*3+順不同のブロック数*64MiB+α のメモリを消費します。
デフォルトで64bit版は6スレッド(1.2GiB+α)、32bit版は2スレッド(386MiB+α)になっていますが
メモリ消費を抑えたい場合は/maxthread オプションでそれより少ない数を指定してください。
(v1.0.0.9でデフォルト数修正)
>BitcasaDiff list \を実行すると
Imported1\ Imported2\ folder1\ folder2\ folder3\となります。
>BitcasaDiff list \\を実行すると
Bitcasa Infinite Drive\ Imported1\ Imported2\となります。
>BitcasaDiff list \\logfolder\としてください。
>BitcasaDiff list \ /rを実行すると
Imported1\ Imported1\folderA\ Imported1\folderA\fileA1 Imported1\folderA\fileA2 Imported1\folderB\ Imported1\folderC\ Imported2\ folder1\ folder1\file1 folder1\file2 folder2\ folder3\となります。
"\"の代わりに"\\"を用いると、
ミラーフォルダも含めてすべてのリモートbitcasaフォルダとその下位が再帰的に列挙されます
>BitcasaDiff list \\ /r /size -2GすべてのBitcasaリモートファイルのうち、サイズが2GiB(2,147,483,648 byte)以下のもの
>BitcasaDiff list \log\*.txt /size 100-2000\log\フォルダの直下の拡張子がtxtのファイルのうち、サイズが100byte以上2000byte以下のもの
/date yyyyMMddhhmmssSSS-yyyyMMddhhmmssSSS または /date yyyy/MM/dd.hh:mm:ss.SSS-yyyy/MM/dd.hh:mm:ss.SSS
各フィールドの区切りはなくてもかまいません。
区切る場合はハイフン'-'と空白' '以外の任意の1文字が使えます。
年yyyyのフィールドは必須ですが、後続のフィールドは省略可能です。
>BitcasaDiff list \\ /r /date 2014-すべてのBitcasaリモートファイルのうち、更新日時(mtime)が2014/01/01.00:00:00.000以降のもの
>BitcasaDiff list \log\*.txt /date 19800101120000000-2012/12/31,12:30:12.000\log\フォルダの直下の拡張子がtxtのファイルのうち、更新日時が1980/01/01 12:00以降で
>BitcasaDiff local I:\を実行すると
Imported1\ Imported2\ Mirrored Folders\ folder1\ folder2\ folder3\となります。
BitcasaDiff list [remotetarget] /remotebase (path) : 列挙するBitcasaリモートフォルダの起点を指定 /remotetarget (target) : 列挙するBitcasaリモートフォルダを指定 /r : サブフォルダ以下も検索して列挙 /d : フォルダ構造を無視(ファイル名のみにする) /regular : targetを正規表現で指定する /hash (type): メモリ上にダウンロードしてハッシュを計算 type=[MD5|SHA1|SHA256|SHA384|SHA512|RIPEMD160] /maxthread (value): ダウンロードする場合のスレッド数(指定のない場合64bit=10,32bit=4) /size (minsize)-(maxsize) : サイズフィルタを使用する /date (start)-(end) : mtime(更新日時)フィルタを使用する /v : 日時やサイズも表示する
BitcasaのリモートフォルダをAPIから見ると、
つまり、通常のI:\の下のフォルダ(folder1-3)はBitcasa Infinite Driveの下に、
リンクの取り込みや、特殊な操作で作られたフォルダ(Imported1-2)はルートの直下に存在しています。
ただしfolder1-3とImported1-2のどちらも、I:\ドライブの直下に存在しているように展開されています。
このため、listコマンドでリモートbitcasaフォルダを指定するときに、"\"と"\\"の2種類のルートの指定方法を用意しました。
"\"で始まるパスを指定すると、I:\で見えているようにfolder1-3とImported1-2がどちらも直下に存在するように、
"\\"で始まるパスを指定すると、APIで見えているようにfolder1-3は"Bitcasa Infinite Drive"の下に存在するように振る舞います。
ミラーされているフォルダは、APIから見るとrootの直下に存在します。
このフォルダはローカルでの展開方法が特殊なので(I:\直下に存在しない)、"\"で始まるパスでは見えないようにしています。
ミラーフォルダを指定したい場合は、"\\"で始まるパスで指定してください。
BitcasaDiff list \test\ BitcasaDiff list \test\*I:\直下のtestフォルダ直下を表示する。
BitcasaDiff list \\log\*.txtAPIルート直下のlogフォルダ直下の拡張子txtのファイルを表示する。
BitcasaDiff list \\log\*.txt /r BitcasaDiff list \\log\*\*.txt BitcasaDiff list /remotebase \\log\ /remotetarget *.txt /r BitcasaDiff list /base \\log\ /target *.txt /r BitcasaDiff list /base \\log\ *.txt /rAPIルート直下のlogフォルダ以下に含まれるすべての拡張子txtのファイルを表示する。
.netの正規表現により
ターゲットを指定できます。
正規表現を用いる場合、remotebaseを明示してください。
フォルダ構成の例で
BitcasaDiff list /remotebase \ /regular "folder.\\file.*" /r BitcasaDiff list /remotebase \ /remoteregex "folder.\\file.*" /rを実行すると
Imported1\folderA\fileA1 Imported1\folderA\fileA2 folder1\file1 folder1\file2となります。
BitcasaDiff local [localtarget] /localbase (path) : 列挙するローカルフォルダの起点を指定 /localtarget (target) : 列挙するローカルフォルダを指定 /r : サブフォルダ以下も検索して列挙 /d : フォルダ構造を無視(ファイル名のみにする) /regular : targetを正規表現で指定する /hash (type): ファイルのハッシュを計算 type=[MD5|SHA1|SHA256|SHA384|SHA512|RIPEMD160] /size (minsize)-(maxsize) : サイズフィルタを使用する /date (start)-(end) : mtime(更新日時)フィルタを使用する /v : 日時やサイズも表示する
オプションの指定方法は、リモートの場合と同様です。
BitcasaDiff diff [localtarget] [remotetarget] /localbase (path) : 列挙するローカルフォルダの起点を指定 /localtarget (target) : 列挙するローカルフォルダを指定 /remotebase (path) : 列挙するBitcasaリモートフォルダの起点を指定 /remotetarget (target) : 列挙するBitcasaリモートフォルダを指定 /regular : targetを正規表現で指定する(local,remote両方) /localregex : localのtargetを正規表現で指定する /remoteregex : remoteのtargetを正規表現で指定する /r : サブフォルダ以下も検索(local,remote両方) /localr : localのみサブフォルダ以下も検索 /remoter : remoteのみサブフォルダ以下も検索 /d : フォルダ構造を無視(ファイル名のみにする) /locald : localのみフォルダ構造を無視 /remoted : remoteのみフォルダ構造を無視 /ignoretime : 更新日時の差異を無視する /ignoresize : サイズの差異を無視する /hash (type): 実際にダウンロードしてハッシュを計算しローカルとの差異も調べる type=[MD5|SHA1|SHA256|SHA384|SHA512|RIPEMD160] /maxthread (value): ダウンロードする場合のスレッド数(指定のない場合64bit=10,32bit=4) /size (minsize)-(maxsize) : サイズフィルタを使用する /date (start)-(end) : mtime(更新日時)フィルタを使用する
>BitcasaDiff diff I:\ \ /rローカルのI:\以下すべてのサブフォルダと、リモートのBitcasaフォルダの差異を検出します。
ファイルリストには以下の接頭辞がつきます。
(L ):ローカルのみに存在する場合(不完全ファイルなど)
( R):リモートのみに存在する場合
(<>):両方に存在するが更新日時またはサイズが違う
(==):両方に存在し更新日時とサイズが同じ
>BitcasaDiff diff C:\log\ \\log\ /rリモートフォルダ\\log\の名前は、事前にlistコマンドで検索して探しておいてください。
ローカルのd:\TSdata\に番組を順次録画しているとします。
BitcasaのI:\TS\にアップロードをして、適当な時期にI:\TV\titleフォルダに移動している場合を考えます。
この場合、ローカルの検索対象はd:\TSdata\*、リモートの検索対象は\TS\* または \TV\*\*となります。
2014/04以降に録画したファイルがTVフォルダに移動したものも含めて、アップロードできているか確認するには
>BitcasaDiff diff /localbase D:\TSdata\ /localtarget * /remotebase \ /remoteregex "(TS|TV)\\.*" /remoter /d /date 201404-
/hash オプションを使用すると、
listコマンドではリモートBitcasaファイルをAPIでダウンロードしてハッシュを計算
localコマンドではローカルファイルのハッシュを計算
diffコマンドでは、リモートとローカルの双方のハッシュを計算して相違がないか確かめます。
使用できるハッシュは、MD5 SHA1 SHA256 SHA384 SHA512 RIPEMD160
複数指定する場合は、以下の例のように空白以外の任意の文字で区切って並べて指定してください。
>BitcasaDiff list \test\*.txt /hash MD5,SHA1
APIでダウンロードしたときに、不整合なデータ応答がある場合があります。
(ファイルが壊れている場合と、向こう側のバグの場合があり 206 unmatchと表示されます)
時々発生しますが、自動リトライで正常にダウンロードできる場合がほとんどです。
64MiBブロックごとに最大5回までリトライし、ファイル全体のダウンロードを最大3回試行します。
ダウンロードに失敗した場合、ハッシュは空白として扱われ表示されません。
ダウンロードに失敗したファイルリストをカレントのfail_download.logに出力する。
>BitcasaDiff list \test\*.txt /hash MD5,SHA1 /faillog
>BitcasaDiff diff d:\test\*.txt \test\*.txt /hash MD5,SHA1