尝试删除隔离存储中的目录时出现异常

时间:2011-07-23 16:32:56

标签: c# silverlight windows-phone-7 isolatedstorage

当我尝试删除Windows Phone 7中隔离存储中的目录时,出现以下异常:

访问IsolatedStorage时发生错误 没有内在的例外。

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

注意:

  1. 将它放在try-catch中会隐藏异常,但仍然不删除目录!
  2. 在调用之前我使用DeleteFile()删除其中的所有文件,因此问题无法与目录中的现有文件相关。
  3. 修剪目录名称是为了确保它是有效的目录名。
  4. 有什么想法吗?

    感谢。

5 个答案:

答案 0 :(得分: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. 文件路径中的'\'和'/'之间没有区别
  2. 当删除DeleteDirectory时,
  3. trimEnd()是必需的,否则抛出“path必须是有效文件名”。
  4. GetFileNames()和GetDirectoryNames()仅返回名称部分而不是完整路径。所以为了使用每个结果,你需要将它与目录(在这个例子中为DeleteFile())
  5. 结合起来

答案 1 :(得分:1)

根据您的代码和描述,您将在每次迭代时重新创建IsolatedStorageFile访问权限?

您应该发布所有代码,因为错误与您到目前为止所说的内容无关。至于一个工作示例,请参阅this blog post。如果它失败了您的目录名称,那么您显然做错了。

另外,我相信它使用反斜杠,而不是路径的正斜杠,所以你的Trim()无论如何都会变得无用。

答案 2 :(得分: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);
    }`

答案 3 :(得分:0)

感谢valipour,我解决了问题

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

在我的例子中,变量dir是“images”。要获取“images”目录中的所有文件名,您应该使用isf.GetFileNames("images/*")

答案 4 :(得分:0)

抓住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;
        }
    }