WindowsのOneDriveのファイルには、以下の3つの状態があります。
- 今はクラウド上にしかないもの
- 今はローカルにあるもの
- 常にローカルにあるもの
エクスプローラー上の[状態]カラムには、それぞれの状態で異なったアイコンが表示されます。
ファイルを右クリックしてメニューから「空き容量を増やす」を行うと、の状態になります。
「今はクラウド」のファイルは、アプリケーションからアクセスを受けると自動的にダウンロードされ、開かれます。
プログラムからはCreateFileするだけです。特別な処理は要りません。
ただし、ファイルにアクセスするアプリケーションの状況によっては、ファイルをダウンロードできず、オープンエラーになる場合があります。
OneDriveの使用ユーザー権限とSYSTEM権限からのプロセスの違いを比べてみたところ、以下のようになりました。
- ユーザーセッションに起動した、ユーザー権限のプロセスからアクセスすると、アクセスできる。(通常の操作)
- ユーザーセッションに起動した、SYSTEM権限のプロセスからアクセスすると、アクセスできる。(通常の操作)
- セッション0に起動した、ユーザー権限のプロセスからアクセスすると、ERROR_CLOUD_FILE_ACCESS_DENIED (395)。
- セッション0に起動した、SYSTEM権限のプロセスからアクセスすると、ERROR_CLOUD_FILE_ACCESS_DENIED (395)。
基本的にセッション0からOneDriveのファイルを自動的にダウンロードすることはできないようです。
ネットワーク越しにOneDriveのファイルにアクセスすると、アクセスできましたが、該当ユーザーがログオフ状態の場合は、ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING(362)というエラーが返ります。「クラウド ファイル プロバイダーが実行されていません」という意味です。
クラウド ファイル プロバイダーというのは、実はユーザーセッションに起動している「OneDrive.exe」プロセスのことです。
ログオンしていないと、もちろんOneDrive.exeプロセスも起動していないのでエラーになるというわけです。
ログオンしていても、OneDrive.exeがアプリケーションエラーなどでクラッシュしていたり、プロセスを強制終了してしまうと、ローカルからの操作でも同じERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING(362)エラーになります。
の状態のファイルには、
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS (0x00400000)
という属性が付いています。
それぞれの状態のファイル属性を調べてみると、
「今はクラウド」
FILE_ATTRIBUTE_UNPINNED (0x00100000)
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS (0x00400000)
「常にローカル」
FILE_ATTRIBUTE_PINNED (0x00080000)
「今はローカル」の状態では、上記のフラグのどれもついていませんでした。
ファイル属性ということは、コマンドプロンプトのattribコマンドとか、SetFileAttributes APIで簡単に状態を変えられるということです。
「今はクラウド」
attrib [ファイルパス] +U
「常にローカル」
attrib [ファイルパス] +P
「今はクラウド」
DWORD dwAttr = GetFileAttributes(pFileName);
dwAttr &= ~FILE_ATTRIBUTE_PINNED;
dwAttr |= FILE_ATTRIBUTE_UNPINNED;
SetFileAttributes(pFileName, dwAttr);
「常にローカル」
DWORD dwAttr = GetFileAttributes(pFileName);
dwAttr &= ~FILE_ATTRIBUTE_UNPINNED;
dwAttr |= FILE_ATTRIBUTE_PINNED;
SetFileAttributes(pFileName, dwAttr);
属性は変えられますが、OneDrive.exeが起動していないとダウンロードやアップロードは行われないところは同じです。