# bitcasaDiff の使い方

return

## (目的)

BitcasaAPI経由で取得できるファイルリストは、アップロードが完了したファイルのみが取得できるので
APIで取得したBitcasaのファイルリストとローカルのファイルリストを比較することにより、
アップロード忘れや不完全ファイルなどのアップロード失敗ファイルを検出する

API経由でダウンロードできるか確かめてハッシュを計算する

## (更新履歴)

- 1.0.0.1 (2014/04/14)
  公開バージョン
- 1.0.0.2
  ラッパーを除去してC++で直接呼ぶように変更
- 1.0.0.3
  保存しているトークンを外部から窃用されないように難読化
  メモリ上にダウンロードしてハッシュを計算できるように
- 1.0.0.4
  ファイルの日時やサイズを表示するオプション
- 1.0.0.5(2014/07/14)
  メッセージを修正して公開
- 1.0.0.6(2014/07/16)
  APIが正常な応答を返さないときに無限にリトライしていたのを失敗させるように
- 1.0.0.7(2014/07/17)
  list /hashでダウンロードに失敗したファイルリストをfail_download.logに出力できるように
- 1.0.0.8(2014/07/17b)
  トークン取得時に落ちる問題を修正
- 1.0.0.9(2014/07/18)
  ダウンロードAPIのアクセス方法が変わったのに対応
  速度が上がったのでデフォルトのダウンロードスレッド数を変更
  表示修正
- 1.0.1.0(2014/07/20)
  fail_download.logにASCII以外の文字が出力できないのを修正
  標準出力もfail_download.logもUTF8で出力します

## (準備)

1. bin_x64フォルダ、又はbin_x86xpフォルダの中身を好きな場所にコピーしてください。
   bin_x64フォルダのexeは64bitコンパイル(windows 7用) bin_x86xpフォルダのexeは32bitコンパイル(windows XP以降用)しています。

2. Visual Studio 2013のランタイムと .NET Framework 4が必要です。
   システムにインストールされていない場合は、リンクしたmicrosoftのサイトから落として入れてください。

3. bitcasaDiffをコマンドラインから呼び出して実行です。

   list
     Bitcasaのフォルダの内容リストを表示

         >BitcasaDiff list (remotetarget)

   local
     ローカルのフォルダの内容リストを表示

         >BitcasaDiff local (localtarget)

   diff
     ローカルのフォルダと、Bitcasaのフォルダの相違を検索

         >BitcasaDiff diff (localtarget) (remotetarget)

4. 初回起動時に、API認証の画面が表示されます。->login.jpg
   取得したトークンはカレントフォルダにファイル名tokenとして難読化して保存されます。
   アカウントを切り替えたい場合は、このファイルを削除して起動してください。

## (制限事項)

Bitcasa APIの制限により、
< > : " / \ | ? *
をパスに含むファイル　および　先頭がドット(.)で始まるファイル名またはパス名のファイルは検索できません。
先頭がドットのファイルはWindowsにおいて許されているので、これらのファイルは
ローカルには存在し、リモートで見つからない扱いとなります。現時点で回避方法はありません。

## (実行時の注意)

/hash オプションをつけてlist, diffを実行すると、Bitcasaからのダウンロードが発生します。
このとき、最大スレッド数*64MiB*3+順不同のブロック数*64MiB+α のメモリを消費します。
デフォルトで64bit版は6スレッド(1.2GiB+α)、32bit版は2スレッド(386MiB+α)になっていますが
メモリ消費を抑えたい場合は/maxthread オプションでそれより少ない数を指定してください。
(v1.0.0.9でデフォルト数修正)

## (簡単な使い方)

#### 例1 : I:\の直下のリモートフォルダを列挙する

フォルダ構成の例で

    >BitcasaDiff list \

を実行すると

    Imported1\
    Imported2\
    folder1\
    folder2\
    folder3\

となります。

#### 例2 : APIルートのフォルダを列挙する

フォルダ構成の例で

    >BitcasaDiff list \\

を実行すると

    Bitcasa Infinite Drive\
    Imported1\
    Imported2\

となります。

#### 例3 : ミラーしているフォルダの列挙

c:\logfolder\ をミラーしているとします。
その場合、APIルート直下にlogfolderとしてリモートフォルダが存在します。
このフォルダを列挙したい場合、

    >BitcasaDiff list \\logfolder\

としてください。

#### 例4 : 再帰検索して列挙

フォルダ構成の例で

    >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フォルダとその下位が再帰的に列挙されます

ファイルが大量に保存されている場合、向こうのサーバが応答するまで数十秒かかります。
通常、約1分でタイムアウトするはずです。それ以上無応答の場合は強制終了してください。
向こうのバックエンドの応答が遅く、受付サーバから502や503を受け取った場合
3回まで自動リトライします。

#### 例5 : サイズ指定して列挙

    >BitcasaDiff list \\ /r /size -2G

すべてのBitcasaリモートファイルのうち、サイズが2GiB(2,147,483,648 byte)以下のもの
を列挙する。

    >BitcasaDiff list \log\*.txt /size 100-2000

\log\フォルダの直下の拡張子がtxtのファイルのうち、サイズが100byte以上2000byte以下のもの
を列挙する。

#### 例6 : 日付指定して列挙

書式 : yyyy 年(4桁), MM 月(2桁), dd 日(2桁), hh 時(2桁), mm 分(2桁), ss 秒(2桁), SSS ミリ秒(3桁)

    /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以降で
2012/12/31 12:30:12以前のものを列挙する。

#### 例7 : I:\の直下のローカルフォルダを列挙する

フォルダ構成の例で

    >BitcasaDiff local I:\

を実行すると

    Imported1\
    Imported2\
    Mirrored Folders\
    folder1\
    folder2\
    folder3\

となります。

## (パラメータの説明)

##

### リモートBitcasaフォルダの内容表示

#### パラメータ一覧 list コマンド

    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 : 日時やサイズも表示する

#### BitcasaAPIから見えるフォルダの構成

BitcasaのリモートフォルダをAPIから見ると、

- I:\
  - folder1
    - file1
    - file2
  - folder2
  - folder3
  - Imported1
    - folderA
      - fileA1
      - fileA2
    - folderB
    - folderC
  - Imported2

という階層の構造が、

- root
  - Bitcasa Infinite Drive
    - folder1
      - file1
      - file2
    - folder2
    - folder3
  - Imported1
    - folderA
      - fileA1
      - fileA2
    - folderB
    - folderC
  - Imported2

として見えています。

つまり、通常の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\*.txt

APIルート直下の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 /r

APIルート直下のlogフォルダ以下に含まれるすべての拡張子txtのファイルを表示する。
targetを指定すると、remotebaseとremotetargetが自動でセットされます。
オプションによりこれを手動で設定できます。
listモードの場合 remotebase は base、remotetarget は targetと省略できます。
remotetargetオプションがない場合、オプションでない最初の引数が採用されます.

#### 正規表現でターゲットを指定する。

.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

となります。

### ローカルフォルダの内容表示

#### パラメータ一覧 local コマンド

    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 : 日時やサイズも表示する

オプションの指定方法は、リモートの場合と同様です。

### ローカルのフォルダと、Bitcasaのフォルダの相違を検索

#### パラメータ一覧 diff コマンド

    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(更新日時)フィルタを使用する

#### 例8 : Bitcasaフォルダに不完全ファイルがないか検索する

    >BitcasaDiff diff I:\ \ /r

ローカルのI:\以下すべてのサブフォルダと、リモートのBitcasaフォルダの差異を検出します。
ただし、ミラーフォルダ、.で始まるファイルフォルダは対象外です。

ファイルリストには以下の接頭辞がつきます。
(L )：ローカルのみに存在する場合(不完全ファイルなど)
( R)：リモートのみに存在する場合
(<>)：両方に存在するが更新日時またはサイズが違う
(==)：両方に存在し更新日時とサイズが同じ

#### 例9 : ミラーが完全かどうかチェックする

ローカルのc:\log\フォルダをミラーしているとします。

    >BitcasaDiff diff C:\log\ \\log\ /r

リモートフォルダ\\log\の名前は、事前にlistコマンドで検索して探しておいてください。
.で始まるファイルフォルダは対象外です。

#### 例10 : 複雑な使い方

ローカルの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
複数指定する場合は、以下の例のように空白以外の任意の文字で区切って並べて指定してください。

#### 例11 : ダウンロードしてハッシュリストをつくる

リモートのI:\test\ 以下の*.txtファイルを実際にダウンロードしてハッシュを計算する。
ダウンロードされた内容はメモリ上に保持されハッシュ計算後に破棄されます。

    >BitcasaDiff list \test\*.txt /hash MD5,SHA1

APIでダウンロードしたときに、不整合なデータ応答がある場合があります。
(ファイルが壊れている場合と、向こう側のバグの場合があり 206 unmatchと表示されます)
時々発生しますが、自動リトライで正常にダウンロードできる場合がほとんどです。
64MiBブロックごとに最大5回までリトライし、ファイル全体のダウンロードを最大3回試行します。
ダウンロードに失敗した場合、ハッシュは空白として扱われ表示されません。

ダウンロードに失敗したファイルリストをカレントのfail_download.logに出力する。

    >BitcasaDiff list \test\*.txt /hash MD5,SHA1 /faillog

#### 例12 : ハッシュも含めて相違がないか確かめる

リモートのI:\test\ 以下の*.txtファイルが、D:\test\ 以下と一致しているか確かめる。
さらに一致しているファイルに対して、ローカルファイルのハッシュを計算し
リモートファイルはダウンロードしてハッシュを計算しハッシュが一致するかも確かめる。

    >BitcasaDiff diff d:\test\*.txt \test\*.txt /hash MD5,SHA1