2

異なる親の場所にあるフォルダーを表すStorageFolderオブジェクトでDeleteAsyncを呼び出すときの、DeleteAsyncの動作について少し混乱しています。削除するフォルダーの親の場所が、たとえばローカルアプリケーションデータフォルダーである場合、コンテンツ(ファイルとサブフォルダー)が含まれている場合でもフォルダーを削除できます。親の場所がたとえばドキュメントライブラリである場合、フォルダが空でない場合、「ディレクトリは空ではありません。(HRESULTからの例外:0x80070091)」という例外が発生します。

もちろん、ドキュメントライブラリにアクセスする機能を宣言し、アプリマニフェストでファイルの種類を宣言しました。これらのファイル(私のテストケースではテキストファイル)へのアクセスが機能することを証明するために、私のテストアプリはフォルダーを作成し、その中にテキストファイルを作成します。アプリは、フォルダから単一のテキストファイルを削除することもできます。ただし、親フォルダがドキュメントライブラリの場合、フォルダ全体を削除することはできません。

誰かがこの異なる行動を説明できますか?これは、アプリケーションデータフォルダー内のデータが他のデータ(ほとんどの場合ユーザーデータ)よりもリラックスして処理されるという仮定(確かにはわかりません)に関係している可能性があります。この仮定のヒントは、アプリケーションデータフォルダー内のファイルを削除すると、常にそれらのファイルが完全に削除されますが、他のフォルダー内のファイルを削除すると、ごみ箱に移動できるということです。

編集:これ が私のテストアプリです:www.juergen-bayer.net/Downloads/FolderDeletionTest.zip

4

2 に答える 2

1

あなたが説明する振る舞いは、私には完全に理にかなっているようです。アプリケーションのローカルフォルダーはアプリが所有しており、理論的には、そのすべてのコンテンツをアプリで自由に操作できます。ネストされたフォルダの削除はその好例です。アプリは、空でないフォルダーの削除を含め、適切と思われるすべてのデータを削除できる必要があります。

ただし、ユーザーのドキュメントフォルダはまったく別の獣です。アプリで作成したフォルダーにユーザーがコンテンツを追加するのを止める(または難しくする)ことは何もありません。エクスプローラーを開くだけで、フォルダーのコンテンツにアクセスできるようになります。アプリがここでフォルダーを削除したい場合は、フォルダーを削除する前に、フォルダー内にユーザーが作成したドキュメントがないことを絶対に確認する必要があります。コードで削除するときにこの追加のハードルを追加すると、開発者は、コンテンツを1つずつ削除することを実際に妨げない場合でも、実行しようとしているアクションについて考える必要があります。

つまり、要するに、アプリは独自のフォルダーを所有しており、独自のデータについて好きなだけキャバリアーにすることができます。ドキュメントライブラリを所有していないため、ファイルでいっぱいのフォルダ全体を一気に削除することはできません。

于 2013-01-06T10:07:05.060 に答える
0

このフォルダ内の一部のファイルまたはディレクトリには、現時点で他のスレッド/アプリケーションまたはコードによってアクセスされているようです。ファイルを1つずつ削除してみてください。アクセスエラーが発生すると思います。

于 2013-01-05T13:06:26.277 に答える