bitcasaへの転送時、転送が完全に終了するのを待ってから次のファイルをコピーする
キャッシュフォルダの下にあるoutgoingフォルダに転送待ちのブロックのリストが 入るようなので、そこを監視して空になり次第、次のファイルをコピーする。
copytobitcasa.exeをコマンドラインから呼び出して実行です。
copytobitcasa (src) (dest) [options]
copytobitcasa d:\video\*.mp4 i:\video\
d:\video\ 直下にある拡張子がmp4のファイルを、bitcasaドライブ i:\video\ フォルダに 順次コピーします。
copytobitcasa d:\tsfiles\*.ts i:\ts\ /r
d:\tsfiles\ フォルダの中を再帰的に走査して、*.tsのファイルを d:\tsfiles\ からみた フォルダ構造を保ったまま i:\ts\ フォルダ以下にコピーします。
例えば
d:\tsfiles\nanoha\as1.ts d:\tsfiles\nanoha\as2.ts d:\tsfiles\madoka\madoka1.ts
をコピーすると
i:\ts\nanoha\as1.ts i:\ts\nanoha\as2.ts i:\ts\madoka\madoka1.ts
となります。
copytobitcasa d:\tsfiles\*.ts i:\ts\ /r /d
d:\tsfiles\ フォルダの中を再帰的に走査して、*.tsのファイルをフォルダ構造を無視して i:\ts\ フォルダの直下にコピーします。
例えば
d:\tsfiles\201201\anime1.ts d:\tsfiles\201202\anime2.ts d:\tsfiles\201203\anime3.ts
をコピーすると
i:\ts\anime1.ts i:\ts\anime2.ts i:\ts\anime3.ts
となります。
copytobitcasa d:\tsfiles\*.ts i:\ts\ /date 201201-201202
d:\tsfiles\ フォルダの直下にある*.tsファイルのうち、更新日時が 2012/01/01 0:00:00 から 2012/02/01 0:00:00 であるファイルを i:\ts\ フォルダの直下にコピーします。
copytobitcasa d:\log\*.txt i:\log\ /move
d:\log\ フォルダの直下にある*.txtファイルを、i:\log\ フォルダの直下にコピーした後
元ファイルを削除します。
ファイルの転送の完了を逐次待つので、小さいファイルの場合通常より転送が遅くなります。
bitcasaは正式版になりましたが有料βの心意気が必要な状態です。
もしincompleteファイルが発生した場合、ファイルを復元することは不可能となります。
十分理解してこのオプションを使用してください。
copytobitcasa \\?\d:\verylongpath\*.txt \\?\i:\log\
d:\verylongpath\ フォルダの直下にある*.txtファイルを、i:\log\ フォルダの直下にコピーします。
この指定方法(\?\をsrc,dest共に先頭に付加)を使用した場合は、MAX_PATHをこえるくらいの長さの
ファイル名がある場合の不具合を回避できます。
ただし、このような長いパス名はエクスプローラを含むいくつかのソフトで
面倒なことが起こる場合があるので注意してください。
copytobitcasa d:\withsemicolon\test;test.txt i:\log\ /scan
d:\withsemicolon\test;test.txt ファイルを、i:\log\ フォルダにコピーします。
/scanオプションを指定すると、ターゲットフォルダの対象ファイルの更新日時サイズの
チェックにFindFirstFile()ではなくGetFileInformationByHandle()を使用します。
なぜかBitcasaドライブにおいて";"(セミコロン)が含まれているファイル名を直接指定して FindFirstFile()を行うと失敗するというバグがあるので、このバグを回避するのに 使用してください。 (windowsUI 1.1.3.25でこのバグは解消された模様です)
ただし、GetFileInformationByHandle()のためにCreateFile()をすると、各ファイルで
通信が発生するので、大量にファイルが含まれているBitcasaフォルダでこのオプションを
指定した初回はスキャンが非常に遅くなります。
一度読んだフォルダはデータがキャッシュされている限りFindFirstFile()と同等の
速度でスキャンできるようです。
/t : テストモード このスイッチを指定すると、ファイルのリストアップのみを行いコピーはしません。 オプションで指定した条件があっているかのテストに使ってください。 /ini (inifilename) デフォルトはcopytobitcasa.iniですが(実行ファイル名.ini)、outgoingフォルダを 記述したiniファイルを(inifilename)で指定できます。 /r : 再帰走査モード ソースに指定されたフォルダ直下のみではなく、その下のフォルダを再帰的に走査します。 /d : ディレクトリ構造を無視 デフォルトではコピー元のフォルダ構造を保ってコピーしますが、ターゲットフォルダの 直下にフォルダを作らずそのままコピーします。 /override : 必ず上書き /differ : サイズか更新日時が異なる場合に上書き /update : コピー元の更新日時の方が新しい場合に上書き /nooverride : 同じファイルがある場合はコピーしない デフォルトではコピー先に同名ファイルがある場合、サイズか更新日時が異なる場合にのみ 上書きし、その他の場合はスキップします(/differ) この動作を変更したい場合に指定してください。 /size (min)-(max) コピー元のファイル名が一致するファイルのうち、指定したサイズのファイルのみを コピーします。 (min)と(max)はどちらかを省略できます。 100- は100byte以上 -10M は10MiB(=10485760byte)以下です。 /date (start)-(end) コピー元のファイル名が一致するファイルのうち、指定した更新日時のファイルのみを コピーします。 (start)と(end)はどちらかを省略できます。 日付の指定は 20010101123050000 のようにyyyymmddHHMMSSsss 形式で数字の連続でも 2001/01/01.12:30:50.000 のように区切りを入れて指定してもどちらでもかまいません。 区切りは数字と空白以外の文字ならどれでもかまいません。 年は1601年以降である必要があるので4桁でなければなりません。 それ以降の月日時分秒とサブミリ秒は任意に省略でき、0もしくは1と見なされます。 月日などが1桁の場合、区切り文字がある場合は 2012/1/1のように指定できますが 20120101 の形式の場合は0を入れて桁数を合わせてください。 /move 移動モード ファイルをコピーした後、元ファイルを削除します。 各ファイルのコピーを始める前に書き込み排他でファイルを開き、失敗した場合は中止します。 1ファイルコピー終了するとDeleteFile()を行います。ファイルは直ちにアクセスできなくなりますが、 実際に消えるのは全体の実行が終わってからのようです。 何らかの要因で不完全ファイルとなってしまった場合、ファイルを復元することが できなくなりますので、十分注意して使用してください。 /scan GetFileInformationByHandle()を使用する Bitcasaドライブ内で";"(セミコロン)を含むファイル名を直接指定したFindFirstFile()が なぜか失敗するバグを回避します。 この方法でBitcasaドライブをスキャンすると、通信が発生して遅くなります。 /wait 待ち合わせのパラメータを指定(詳しくはwait.txt参照) 何も指定していない場合、デフォルト値として /wait=0,15000,10000,25000,0,2000,100M,500M,0.001,1.0,5.0,1.0 が指定されているのと同じになります。 デフォルト値から変更しないパラメータは省略できますが、,(コンマ)は省略できません。 空白なしで=に続けて,(コンマ)区切りで非負の数値を指定できます。 7,8フィールド目のバイト指定はsizeオプションと同様に単位指定が可能です。
複数のcopytobitcasaを起動した場合、Mutexで待ち合わせをして一つだけが コピー動作を行い、残りは待機します。
copytobitcasaでコピー中に、エクスプローラーなど他のプログラムからIドライブに コピーした場合でも問題なく動作するはずですが、そのファイルが完全に転送されるまで 次のファイルに進みません。
途中で止めたくなった場合、ctrl+cで止まります。
待機中の場合は直ちに、CopyFileEx()でコピー中の場合は本当に中止するかのプロンプトに
yを押した場合にコピーをキャンセルして終了します。
プロンプトにy以外を押した場合はコピーを継続します。
更新日時は、bitcasa側でサブミリ秒は切り捨てられるので秒までの一致をみています。
outgoingフォルダの監視は、uuidっぽいフォルダの直下に何らかのフォルダがあるかどうかで チェックしています。
windowsUI 1.1.2.11のバージョンでは(その少し前のバージョンから)、その下にファイルが存在しなく
なっているにもかかわらず、上位のハッシュ先頭の名前がついたフォルダが消えないことが
よく発生するようになりました。
このため、outgoingの下のフォルダ数が10を下回る場合、その下の階層にファイルが
存在しているかチェックを行い、ファイルが全くないのにフォルダが残っている場合、
自動で空フォルダを削除しています。
GetTickCount64()がxpになかったので、GetTickCount()で代用しています。
いわゆる49日問題で、システムの起動時間が49.7日を超えるタイミングで経過時間を
取得したときにおかしな速度が出ますが、表示だけなので問題ないはずです。
ほかのインスタンスの待ち合わせのMutexを解放する確率に、解放せずに転送している
時間を使っていますが、負になったときは適当にごまかしているので大丈夫だと思います。
FindFirstFileEx()のオプションの、FindExInfoBasicがwindows 7からだったので、
32bit版ではFindExInfoStandardを使っています。
このため、短いファイル名も検索されます。短いファイル名が自動生成されている場合
ワイルドカード指定によっては、予期せぬファイルが混じることがあるので注意してください。
NYSL:煮るなり焼くなり好きにしろライセンス でお願いします。お好きにどうぞ。
コンパイルは Visual Studio 2012 で行いました。
32bitコンパイル版はWindows XP 仮想環境で動作テストを一応行いましたが、 常用していないため想定外の不具合があるかもしれません。