Исключение при попытке удалить каталог в изолированном хранилище - PullRequest
1 голос
/ 23 июля 2011

При попытке удалить каталог в изолированном хранилище в Windows Phone 7 появляется следующее исключение:

Произошла ошибка при доступе к IsolatedStorage.
нет внутреннего исключения.

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

Примечания:

  1. Если поместить его в try-catch, будет скрыто исключение, но каталог все равно не будет удален!
  2. перед вызовом этого я удаляю все файлы внутри, используя DeleteFile (), поэтому проблема не может быть связана с существующими файлами в каталоге.
  3. Обрезать имя каталога, чтобы убедиться, что это правильное имя каталога.

Есть идеи?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 24 июля 2011

Хорошо, проблема решена, проблема была в том, что файлы не удалялись правильно. Причина, по которой я был сбит с толку, заключается в том, что класс 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. нет разницы между '\' и '/' в путях к файлам
  2. trimEnd () требуется, когда DeleteDirectory в противном случае генерируется исключение «путь должен быть допустимым именем файла».
  3. GetFileNames () и GetDirectoryNames () возвращают только часть имени, а не полный путь. поэтому, чтобы использовать каждый результат, вам нужно объединить его с каталогом (в этом примере - DeleteFile ())
1 голос
/ 02 августа 2014
    `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);
    }`
1 голос
/ 23 июля 2011

Согласно вашему коду и описанию, вы будете воссоздавать доступ к IsolatedStorageFile на каждой итерации?

Вы должны опубликовать весь код, поскольку ошибка не связана с тем, что вы сказали до сих пор.Что касается рабочего примера, см. это сообщение в блоге .Если это не так с вашим именем каталога, вы явно делаете что-то не так.

Кроме того, я считаю, что он использует обратную косую черту, а не прямую косую черту для путей, поэтому ваш Trim () в любом случае будет довольно бесполезным.1007 *

0 голосов
/ 12 июля 2013

Захватил версию Valipour и заставил ее работать.Добавлены некоторые проверки для улучшения стабильности + исправлены некоторые имена.Это работает для меня на 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;
        }
    }
0 голосов
/ 11 июля 2012

Благодаря valipour я решил проблему

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

В моем случае переменная dir - это "images".Чтобы получить все имена файлов в каталоге «images», вы должны использовать isf.GetFileNames("images/*")

...