SkyDrive を Windows 標準機能でネットワークドライブとして使う

マイクロソフトで Windows Live SkyDrive という 25GB の無料のストレージを提供している事を知っている人は多いと思います。

2011/3/11 に発生した地震と津波の被害を見ていて多くの人が、普段のバックアップではこのような災害の場合には無意味だと感じたと思います。 バックアップした HDD はどこかへ流され、HDD は衝撃に弱いので壊れて使い物にならない可能性が高いです。 なにより見つからない可能性の方が高いですよね。
システムは作り直せば問題ないので、システム全体のバックアップよりは個々の大切なファイルのバックアップが出来ているかどうかが重要になります。しかし、外付け HDD では不安。。。SSD なら衝撃にも耐える可能性は高いですが、見つからない場合も考えると、なんとかこの 25GB を無料で有効活用出来ないかと考えていました。 しかも、Windows Live ID のアカウント毎に 25GB ですから、複数個あれば容量も増やせます。

さらに、関東地方では計画停電で、ノート PC か UPS が用意されたデスクトップ PC でない限り停電中は使えませんし、会社が計画停電内で自宅が計画停電外だとして、外付け HDD や USB でデータを持ち運ぶというのも大変ですしリスクも大きくなります。 そういった場合でも 25GB を使いたいですよね。

この SkyDrive を Windows からアクセスできるネットワークドライブとして、ドライブ名を割り当てるフリーや有料ソフトも存在しています (検索すればいっぱい出てくるでしょう)。
でも、Windows 標準機能で実現できれば、余分なソフトをいれずにすみますし、何より簡単で無料です。 ただ、SkyDrive のサイトから使用する場合と比べて、出来ることと出来ない事があります (1 つのファイルが 100 MB という上限はどちらも同じ)。
2011/6/21 のアップデートで、SkyDrive 自体のアクセスも早くなり、ブラウジングやダウンロードはとても操作しやすくなりましたが、アップロードの仕組みは従来どおりでした。

  ネットワークドライブとして使用 SkyDrive サイトから
アップロード&ダウンロード
扱えるファイル アップロードは Microsoft Office ファイルのみ どのファイルでも OK
フォルダの作成 可能
(フォルダ内のファイルもコピー可能)
不可能
(アップロードはファイル単体のみでフォルダごとはむり)
フォルダ内の
ファイルの参照
写真の表示やドキュメントの表示/更新など
Wndows Explorer から 直接
SkyDrive に対して行える
ブラウザを介して表示や更新
(更新はOfficeファイルのみ対応)

これを見ると、Microsoft Office 以外のファイルがアップロードできれば、ネットワークドライブとして使用できた方がかなり便利です。 ビデオファイルなどでもない限りそんなに 100MB を超えるファイルは無いはずなので、バックアップとしての実用にも使えると思っています。
また、有料ソフトを使っても、単純に 100MB の上限にあわせてファイルを分割してアップロードするだけなので、いざ利用するとしてもダウンロードしてつなぎ合わせる必要があるので非現実的ですので、100MB を超えるファイルに関しては、分割できるようであればユーザーが分割(ビデオファイルであれば、長さを短くしたファイルにするなど)するというのが良いと思います。

4/12 追記: Windows Azure Storage を使えば、100MB の制限が無いので、こちらも紹介しておきます。
4/14 追記: Live Mesh もあるのでは? っていう人向けに補足で記述しておきます。
4/20 追記: 表に「フォルダ内のファイルの参照」を追加。 SkyDrive の稼働情報などのリンクを追加
6/21 追記: SkyDrive アップデートにより 1ファイル50MBの制限が100MBまで拡充したことによるコンテンツおよび、SkyDriveCopy.exe の変更。これにより途中の余分な追記は削除

調査

さて、すでに SkyDrive 上にある Office 以外のファイル(例えば、JPG や PNG のファイル)は普通にネットワークドライブとして使用した場合もアクセスできます。ということは、アップロード時に何か制限をかけていると思われ、もしかして拡張子 ? という事で、拡張子を DOC に変更してネットワークドライブにコピー。
うまく行きます (^^)。 名前の変更で、拡張子を元の JPG に変更。これもうまく行きます(^^)。表示も出来ます。
!? どうやら拡張子で判断しているだけで、アップロードした後に名前の変更をすれば何も問題ない。 これはいけそうです(^^)。

回避方法

1. ファイルの拡張子を、Microsoft Office が利用する拡張子に変更して、コピー
2. コピーした後に拡張子を元に戻す

これだけですね。ただ、これをいちいち手動でやっていると面倒なので、これと同じ事をするプログラムを作りました。それが SkyDriveCopy です。

SkyDrive をネットワークドライブとして使うには ?

まずは、Windows 標準のネットワークドライブとして使う方法を知らない人のために、その方法をお伝えします。 英語ですが分りやすい情報があるので、それをベースに解説したいと思います。
まず、接続先の URL ですが次のような形式になります

\\docs.live.net@SSL\DavWWWRoot\<オンラインID番号>\<フォルダ名>

オンラインID番号は、Windows Live ID でログインした際にユニークな番号が割り当てられていますので、それを入力します。 英語版の情報から画像を拝借すると下記部分です。


フォルダ名に関しては、最初から存在するフォルダ、例えば Documents であれば、頭に ^2 をつけて、^2Documents とすればアクセスできますし、自分で作ったフォルダ、例えば Backup であれば、そのまま Backup と入れればアクセスできます。

上の画面のように、ドライブへのマッピングを行ってからアクセスするわけですが、ここで [Connect using different credentials] 日本語では、[別の資格情報を使用して接続する] にチェックを入れて、Windows Live ID とそのパスワードでログインします。 その画面が


ですね。 これでこの例では X: ドライブへマッピングを行っています。 この後は直接 X: ドライブへ読み書きする事で SkyDrive へのアクセスになります。

SkyDriveCopy を使えるようにする

この状態で Explorer を使ってファイルのコピーは出来ますし、コマンドラインから Copy コマンドや Robocopy を使って、ファイルのコピーも可能です。 ただし、このままでは先の調査にもあるように拡張子が、Microsoft Office が扱うものに限られてしまいます。 もちろんファイルが多くなければ手動で行えますが、面倒なので SkyDriveCopy を作ってみたというわけです。

C# で作りましたので、.NET Framework 4 が入っていない場合には、下記からダウロードしてインストールします。
.NET Framework 4 Client Profile をダウンロードする

SkyDriveCopy.zip をダウンロードします。

ZIP ファイルなので、中に入っている SkyDriveCopy.exe を適当な場所へコピーするなり、ZIP を展開して使えるようにします。

SkyDriveCopy を使ってみる

 バッチファイルなどで使えるように、コマンドライン プログラムにしてありますので、利用方法はいたって簡単です。
何も引数を与えずにただ実行すると、下記のような画面になります。
CMD1
この例にあるように、
最初の引数: ローカルドライブにあるコピーしたいファイルが入っているパス (この例では、c:\users\admin\documents\)
2番目の引数: SkyDrive にマップしたドライブ内のパス (この例では、z:\)
3番目の引数: どのファイルをコピーするか (*.* だとすべてのファイルが対象になります)

また、最初の引数に指定したフォルダに、100MB を超えているのでコピーしなかったファイルや、エラーが発生したファイルの一覧を記録する、LargerAndError.log というファイルが作られます。 これを後から見ることで、どのファイルがコピーされて、どのファイルがコピーされなかったかが分ります。

例:

Start: C:\Users\Admin\Documents\_Videos, 2011-03-30 13:30:14
Skipped(> 100MB): C:\Users\Admin\Documents\_Videos\HawaiianRollerCoasterRide.mpg
Error: The process cannot access the file 'C:\Users\Admin\Documents\_Videos\LargerAndError.log' 
because it is being used by another process., C:\Users\Admin\Documents\_Videos\LargerAndError.log
Finished: C:\Users\Admin\Documents\_Videos, 2011-03-30 13:39:43
この例では、100MB 以上のためにコピーされなかったファイルが1つある事がわかります。
また、LargerAndError.log がアクセスできなかったという記録がありますが、このエラーは無視してください。ログを記録しているファイルのなので、コピーされないファイルとなります。

コピーの動作

内部の動作説明をしておこうと思います。

1. 入力されたパスを元に該当するファイルやフォルダを検索して、フォルダなら、フォルダの中に入って 1 から繰り返します
2. フォルダの中に入った場合は、SkyDrive 側にフォルダを作ります
3. ファイルのサイズを一つ一つ見ていきます。 100MB を超える場合には除外して、ログに書き込みます。 SkyDrive 側の同じフォルダ内に同じファイルが存在する場合は、日付をチェックして、ローカルの方が古い場合は除外します(SkyDrive 側が新しい)
4. ファイルの後ろに、".doc" をつけて、ローカルから SkyDrive へコピーを行います。 この時、".doc" をつけてない状態のファイルがすでに SkyDrive 側にあり、3 の除外対象で無い場合には、SkyDrive にあるファイルを削除します
5. 名前を変更して、後ろにつけた ".doc" をはずして元の拡張子に戻します
6. 3 にもどってフォルダ内の条件に合うファイルをコピーしていきます
これにより、入力したパスの中にあるサブ フォルダも含めてコピーを行います。
(.NET Framework 4 を使っているのは、3 以降ファイルのコピーを並列処理しているためで、マルチコア CPU を使っていたり、ハイパースレッディング 対応CPU 機種ではパフォーマンスが出るようにするためです)

このような動作のため、一度 SkyDrive にコピーした後は、ローカル側でコピーした時点からファイルの日付が変更されていない限り、再度コピーされる事は無いはずなのですが、、、、自分の Documents をコピーして分ったのですが、2回目以降、ファイルが存在しているにもかかわらず、存在していないと判断して、4 の動作が行われる場合があります。 その場合、5 の名前の変更で失敗し、すでにファイルが存在するということで、IO Exception が発生するので、IO Exception が発生した場合には、".doc" をつけてコピーしたファイルを消すコードを入れました。

また、Index (zero based) must be greater than or equal to zero and less than the size of the argument list というエラーがでる場合もある事がわかりました。 このエラーはファイルのコピーでは通常発生することは無いのですが、対象が SkyDrive で Web フォルダをネットワークドライブとして接続している影響なのかな? という気がします。 ただ、このエラーが出てもファイル自体はコピーできているので、支障は無いように思います。

また、Robocopy のようなミラーリングの機能は実装していないので、ローカル側で削除しても、SkyDrive 側ではファイルが残り続けますので、必要が無い場合には別途手動で SkyDrive 側のファイルを削除してください。

ファイル名に利用できない文字

テストを繰り返すうちに、Windows 環境としては利用可能なファイル名でも、SkyDrive へのコピー時に自動的に変換されてしまう文字や、そのままではエラーになってしまってコピー自体できない文字がある事がわかりました。 そのため、後で SkyDrive から Windows 環境へ Explorer や Copy コマンドを使ってファイルをコピーする時には逆変換されないので、注意してください。
問題は日本語文字列なのですが、同じような現象が発生すると仮定すると、文字によっては文字化けがおきると思います(この手の話では良く出てくる、5c を 2 バイト目に含むファイル名は問題ありませんでした)。

必ずエラーになる文字

& % , ; は必ずエラーになります。最初の3つは The filename, directory name, or volume label syntax is incorrect. か The parameter is incorrect. のエラーになるので、プログラム内で全角の & % 、 に変換し、セミコロンは全角でも、A device attached to the system is not functioning のエラーになるので、[semicolon] と置き換える事にしました。
それと、ピリオド(.) ですが、文字と文字の間であったり、最後の拡張子の前のピリオドは問題ないのですが、ピリオドが続くとエラーになるので、拡張子の前のピリオド以外は、全角の 。 に変換する事にしました。

自動的に変換される文字

例えば次のようなファイルは、
@[]^_`{}~+!#$'-.=.TXT
SkyDriveへコピー後、
@[]^L_`{}^F^M!^N$'-.=.txt
に変換されます、つまり、^ が ^L に、~ が ^F に、+ が ^M に、 # が ^N に、そして全角の % が ^A に、全角の & が ^Bになります。
この変換は自動で行われるので、すでにファイルが存在しているのかどうかのチェックには影響は与えませんし、Explorer でコピーを行っても同じ結果になります。

動作確認

・ Windows 7 Ultimate SP1 32ビット/64ビット版

補足

Live Mesh

Windows Live Mesh というのもあります。
SkyDrive を同期ストレージとして使うことも出来ますが、この場合はここに書かれているように 5GB までとなります (SkyDrive 自体は 25GB でも Live Mesh に使う分は別で 5 GB のみです)。

Live Mesh の機能のうち、指定したフォルダを2 台以上の PC で遠隔同期させる機能があり、この機能は Peer to Peer を使って実現され、その経路にインターネットを使用するだけなので、PC 間の HDD の空き容量が許す限り同期が可能です。 つまり、25GB 以上の同期も出来ます。

例えば、今住んでいる場所は東京だけど、実家は大阪という人の場合、大阪に PC 置いて Live Mesh で同期すれば 25GB 以上の同期が出来るので、プライベート クラウド バックアップ の出来上がりという訳ですね。 こういう環境が用意できるならこの方法もありです。

後、Live Mesh で同期中の場合のフォルダ削除など、注意事項はこちら

SkyDrive の情報

いくつか役立つリンクを載せておきます。
SkyDrive ヘルプ センター: よく寄せられる質問の他、フォーラムで質問ができます。
SkyDrive の状態: サービスの稼働状況がわかります。