2011-07-23 12 views
1

をしようとしたとき、私は、Windows Phone 7の中で分離ストレージ内のディレクトリを削除しようとすると、私は次の例外を取得:例外分離ストレージ内のディレクトリを削除するには、

IsolatedStorageへのアクセス中にエラーが発生しました。
内部例外はありません。

using (var isf = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    isf.DeleteDirectory(dir.TrimEnd('/')); 
} 

注:

  1. のtry-catchに入れるには、例外を非表示になりますが、それでもディレクトリが削除されません!
  2. これを呼び出す前に、DeleteFile()を使ってその中のすべてのファイルを削除するので、問題はディレクトリ内の既存のファイルに関連付けることができません。
  3. ディレクトリ名をトリミングすることは、それが有効なディレクトリ名であることを確認することです。

ありがとうございました。

+0

どれ細部に私の作品?あなたは100%その 'dir。TrimEnd( '/') 'は有効なディレクトリ名を生成しますか? –

+0

内部例外はなく、dirが有効なディレクトリ名であることを確認することです。 –

+0

IsolatedStorageFile.DirectoryExists()を使用することが100%確実であること。 –

答えて

6

問題を解決しました。問題はファイルが正しく削除されていないことでした。私が混乱した理由は、IsolatedStorageFileクラスが無効なファイルを削除しているときに警告しないということです。

public static void DeleteDirectoryRecursive(this IsolatedStorageFile isf, string dir) 
{ 
    foreach (var file in isf.GetFileNames(dir)) 
    { 
     isf.DeleteFile(dir + file); 
    } 

    foreach (var subdir in isf.GetDirectoryNames(dir)) 
    { 
     isf.DeleteDirectoryRecursive(dir + subdir + "\\"); 
    } 

    isf.DeleteDirectory(dir.TrimEnd('\\')); 
} 

注:ここ正しいコードといくつかのメモで、ファイルパスで '\' と '/' との間に差がない

  1. trimEnd()が必要とされたときにDeleteDirectoryそう例外 "パスは有効なファイル名でなければなりません"がスローされます。
  2. GetFileNames()およびGetDirectoryNames()は、完全なパスではなく名前の部分だけを返します。そうvalipourへ
1

あなたのコードとあなたの説明によると、すべての反復でIsolatedStorageFileアクセスが再作成されますか?

エラーはあなたがこれまでに伝えたものと関連していないので、すべてのコードを投稿する必要があります。実際の例については、this blog postを参照してください。それがあなたのディレクトリ名で失敗するならば、あなたは明らかに何か間違っているのです。

また、私は、バックスラッシュを使用し、パスのスラッシュを使用しないと考えていますので、Trim()はむしろ役に立たないでしょう。

+1

(1)いずれのWindowsオペレーティングシステムでも、バックスラッシュとスラッシュはファイルパスで同じに扱われます。 (2)トリミングなし "パスは有効なファイル名でなければならない" –

0

おかげで()DeleteFileを(この例では)それぞれのディレクトリとそれを組み合わせる必要があり、結果を使用するために、私は私の場合、変数DIRを問題

foreach (var file in isf.GetFileNames(dir)) 
{ 
    isf.DeleteFile(dir + file); 
} 

を解決しました"イメージ"です。 "images"ディレクトリ内のすべてのファイル名を取得するには、isf.GetFileNames("images/*")

0

を有効にしてください。安定性を向上させるためにいくつかのチェックを追加し、いくつかの名前を修正。これは、(内部)例外でLumia 920

private void DeleteDirectoryRecursive(string dir) 
    { 
     if (String.IsNullOrEmpty(dir)) return; 

     try 
     { 
      using (var isoFiles = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       foreach (var file in isoFiles.GetFileNames(dir + "\\*")) 
       { 
        var filename = dir + "/" + file; 
        if (isoFiles.FileExists(filename)) 
         isoFiles.DeleteFile(filename); 
       } 

       foreach (var subdir in isoFiles.GetDirectoryNames(dir)) 
       { 
        var dirname = dir + subdir + "\\"; 
        if (isoFiles.DirectoryExists(dirname)) 
         DeleteDirectoryRecursive(dirname); 
       } 

       var currentDirname = dir.TrimEnd('\\'); 
       if (isoFiles.DirectoryExists(currentDirname)) 
        isoFiles.DeleteDirectory(currentDirname); 
      } 
     } 
     catch (Exception e) 
     { 
      throw; 
     } 
    } 
1
`public static void DeleteDirectoryRecursive(string directory, IsolatedStorageFile store) 
    { 
     if (!store.DirectoryExists(directory)) 
      return; 
     var pattern = Path.Combine(directory, "*"); 
     foreach (var file in store.GetFileNames(pattern)) 
     { 
      store.DeleteFile(Path.Combine(directory, file)); 
     } 
     foreach (var folder in store.GetDirectoryNames(pattern)) 
     { 
      DeleteDirectoryRecursive(Path.Combine(directory, folder), store); 
     } 

     store.DeleteDirectory(directory); 
    }` 
関連する問題