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

本文关键字:异常 删除 隔离 存储 | 更新日期: 2023-09-27 18:03:21

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

访问IsolatedStorage时发生错误。
没有内部异常。

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

指出:

  1. 把它放在try-catch中会隐藏异常,但目录仍然没有被删除!
  2. 在调用这个之前,我使用DeleteFile()删除了里面的所有文件,所以问题不能与目录中的现有文件相关。
  3. 修剪目录名是为了确保它是一个有效的目录名。

任何想法?

谢谢。

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

好的,问题解决了,问题是文件没有被正确删除。我感到困惑的原因是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. getfilename()和GetDirectoryNames()只返回名称部分,而不返回完整路径。因此,为了使用每个结果,您需要将其与目录(在本例中为DeleteFile())组合在一起

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

你应该发布所有的代码,因为这个错误与你目前所说的无关。至于工作示例,请参阅这篇博客文章。如果您的目录名失败了,那么您显然做错了什么。

此外,我相信它使用反斜杠,而不是正斜杠的路径,所以你的Trim()将是相当无用的任何方式。

    `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);
    }`

多亏了有效性,我解决了这个问题

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

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

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