views:

46

answers:

1

I'm currently working on an application which writes data to the IsolatedStorageStore. As part of the app, I'd like to implement a "clear all data/reset" button, but enumerating through all the files that exist and all the folders that exist is taking quite a bit of time. Is there a magic "reset" method or something I can use, or should I instead focus on optimizing the manual deletion process?

Or can I get away with not providing such functionality, and leave it to the user to uninstall/reinstall the application for a reset?

My hideous delete-all-files method is below:

    /// <summary>
    /// deletes all files in specified folder
    /// </summary>
    /// <param name="sPath"></param>
    public static void ClearFolder(String sPath, IsolatedStorageFile appStorage)
    {    
        //delete all files
        string[] filenames = GetFilenames(sPath);
        if (filenames != null)
        {
            foreach (string sFile in filenames)
            {
                DeleteFile(System.IO.Path.Combine(sPath, sFile));
            }
        }

        //delete all subfolders if directory still exists
        try
        {
            foreach (string sDirectory in appStorage.GetDirectoryNames(sPath))
            {
                ClearFolder(System.IO.Path.Combine(sPath, sDirectory) + @"\", appStorage);
            }
        }
        catch (DirectoryNotFoundException ex)
        {
            //current clearing folder was deleted / no longer exists - return
            return;
        }

        //try to delete this folder
        try
        {
            appStorage.DeleteDirectory(sPath);
        }
        catch (ArgumentException ex) { }

    }

    /// <summary>
    /// Attempts to delete a file from isolated storage - if the directory will be empty, it is also removed.
    /// </summary>
    /// <param name="sPath"></param>
    /// <returns></returns>
    public static void DeleteFile(string sPath)
    {
        using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            appStorage.DeleteFile(sPath);

            String sDirectory = System.IO.Path.GetDirectoryName(sPath);
            //if this was the last file inside this folder, remove the containing folder
            if (appStorage.GetFileNames(sPath).Length == 0)
            {
                appStorage.DeleteDirectory(sDirectory);
            }
        }
    }

    /// <summary>
    /// Returns an array of filenames in a given directory
    /// </summary>
    /// <param name="sHistoryFolder"></param>
    /// <returns></returns>
    public static string[] GetFilenames(string sDirectory)
    {
        using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            try
            {
                return appStorage.GetFileNames(sDirectory);
            }
            catch (DirectoryNotFoundException)
            {
                return null;
            }
        }
    }
+6  A: 

You're looking for the Remove() method.

Use it like this:

using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
{ 
    store.Remove();
}
Matt Lacey
thanks heaps! I think I tried using that method before but i must have been doing something wrong before as it used to throw an exception...anyway. thanks :)
Blakomen