2012-04-16 4 views
2

Я создал приложение, которое изначально создает базу данных и сохраняет в ней некоторые данные. Теперь я хочу удалить эту базу данных и ее файлы, когда пользователь нажимает кнопку сброса, но я получаю сообщение об ошибке - «это использование в другом процессе». Я хочу, чтобы он удалял и воссоздавал базу данных при нажатии кнопки сброса. Есть идеи?Сброс настроек приложения в wp7

+0

Как удалить файл? Вы закрыли и уничтожили все экземпляры DbContext, указывающие на имя файла? –

+0

Сколько данных вы сотреете? возможно, ApplicationSettings достаточно хорош. –

+0

Восстановить базу данных IsolatedStorage и удалить файлы изображений и аудиофайлы –

ответ

0

Наиболее частой причиной этого является ude для резьбы небезопасный характер взаимодействия с изолированным хранилищем на Windows Phone. Независимо от того, как вы реализуете базу данных (будь то в файле или серии файлов), вы взаимодействуете с изолированным хранилищем на каком-то уровне.

Я настоятельно рекомендую вам прочитать и убедитесь, что вы понимаете this overview of isolated storage, прежде чем заходить слишком далеко.

Ты замечание:

Это используется в другом процессе

заставляет меня думать, что вы используете библиотеку третьей стороны, чтобы сделать ваши вещи базы данных. Это исключение/ошибка возникает, когда сама библиотека не может получить доступ к изолированному хранилищу. Не зная точно, как вы реализуете базу данных, трудно точно говорить о вашей ситуации.

Вы никогда не «воссоздаете Изолированное хранилище», изолированное хранилище - это термин, используемый для определения коллекции дискового пространства, к которой имеет доступ ваше приложение. Подобно папке, это дисковое пространство имеет корень и содержит только файлы, которые вы создаете.

Для того, чтобы избежать исключения потоков при доступе к изолированному хранилищу, убедитесь, что вы используете using ключевое слово в C#, как так:

namespace IsolatedStorageExample 
{ 
    public class ISOAccess 
    { 
     // This example method will read a file inside your Isolated Storage. 
     public static String ReadFile(string filename) 
     { 
      string fileContents = ""; 
      // Ideally, you should enclose this entire next section in a try/catch block since 
      // if there is anything wrong with below, it will crash your app. 
      // 
      // This line returns the "handle" to your Isolated Storage. The phone considers the 
      // entire isolated storage folder as a single "file", which is why it can be a 
      // little bit of a confusing name. 
      using(IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForAppliaction()) 
      { 
       // If the file does not exist, return an empty string 
       if(file.Exists(filename)) 
       { 
        // Obtain a stream to the file 
        using(IsolatedStorageFileStream stream = File.OpenFile(filename, FileMode.Open) 
        { 
         // Open a stream reader to actually read the file. 
         using(StreamReader reader = new StreamReader(stream)) 
         { 
          fileContents = reader.ReadToEnd(); 
         } 
        } 
       } 
      } 

      return fileContents; 
     } 
    } 
} 

Это должно помочь с вашей проблемой безопасности потока. Чтобы быть более конкретно полезно к тому, что вы хотите сделать, посмотрите на следующие методы (Вы можете добавить это в класс выше):

// BE VERY CAREFUL, running this method will delete *all* the files in isolated storage... ALL OF THEM 
public static void ClearAllIsolatedStorage() 
{ 
    // get the handle to isolated storage 
    using(IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     // Get a list of all the folders in the root directory 
     Queue<String> rootFolders = new Queue<String>(file.GetDirectoryNames()); 

     // For each folder... 
     while(0 != rootFolders.Count) 
     { 
      string folderName = rootFolders.Dequeue(); 

      // First, recursively delete all the files and folders inside the given folder. 
      // This is required, because you cannot delete a non-empty directory 
      DeleteFilesInFolderRecursively(file, folderName); 

      // Now that all of it's contents have been deleted, you can delete the directory 
      // itsself. 
      file.DeleteDirectory(rootFolders.Dequeue()); 
     } 

     // And now we delete all the files in the root directory 
     Queue<String> rootFiles = new Queue<String>(file.GetFileNames()); 
     while(0 != rootFiles.Count) 
      file.DeleteFile(rootFiles.Dequeue()); 
    } 
} 

private static void DeleteFilesInFolderRecursively(IsolatedStorageFile iso, string directory) 
{ 
    // get the folders that are inside this folder 
    Queue<string> enclosedDirectories = new Queue<string>(iso.GetDirectoryNames(directory)); 

    // loop through all the folders inside this folder, and recurse on all of them 
    while(0 != enclosedDirectories.Count) 
    { 
     string nextFolderPath = Path.Combine(directory, enclosedDirectories.Dequeue()); 
     DeleteFilesInFolderRecursively(nextFolderPath); 
    } 

    // This string will allow you to see all the files in this folder. 
    string fileSearch = Path.Combine(directory, "*"); 

    // Getting the files in this folder 
    Queue<string> filesInDirectory = iso.GetFileNames(fileSearch); 

    // Finally, deleting all the files in this folder 
    while(0 != filesInDirectory.Count) 
    { 
     iso.DeleteFile(filesInDirectory.Dequeue()); 
    } 
} 

Еще одна вещь, я настоятельно рекомендую реализует класс, который обращается к IsolatedStorage с помощью a «Многопоточный шаблон с одним синглом», как описано here.

Надеюсь, что это полезно. Код предоставляется «как есть», я его не компилировал, но общие понятия есть все, поэтому, если что-то не так, прочитайте документы MSDN, чтобы узнать, где я сработал. Но я заверяю вас, что большинство из них скопировано из моего функционального кода, поэтому он должен работать с очень маленьким фанагированием.

Смежные вопросы