Cómo: Buscar archivos y directorios existentes en almacenamiento aislado

Actualización: noviembre 2007

Usando un archivo de almacenamiento aislado también se puede buscar directorios y archivos existentes. Recuerde que dentro de un almacén, los nombres de archivo y de directorio se especifican en relación con la raíz del sistema de archivos virtual. Además, los nombres de archivo y de directorio de los sistemas de archivos Windows no distinguen entre mayúscula y minúsculas.

Para buscar un directorio, utilice el método de instancia GetDirectoryNames de IsolatedStorageFile. GetDirectoryNames toma una cadena que representa un patrón de búsqueda. Se admiten tanto comodines de un único carácter (?) como comodines de varios caracteres (*). Estos comodines no pueden aparecer en la parte de ruta de acceso del nombre, es decir, directory1/*ect* es una cadena de búsqueda válida, pero *ect*/directory2 no lo es.

Para buscar un archivo, utilice el método de instancia GetFileNames de IsolatedStorageFile. La restricción de caracteres comodín en las cadenas de búsqueda que se aplica a GetDirectoryNames, también se aplica a GetFileNames.

Ni GetDirectoryNames ni GetFileNames son recursivos, es decir, IsolatedStorageFile no proporciona métodos para enumerar todos los directorios o archivos del almacén. Sin embargo, en el código mostrado más abajo hay ejemplos de métodos recursivos. Recuerde también que GetDirectoryNames y GetFileNames sólo devuelven el nombre de directorio o de archivo del elemento encontrado. Por ejemplo, si hay una coincidencia en el directorio RootDir/SubDir/SubSubDir, en la matriz de resultados se devolverá SubSubDir.

Ejemplo de FindingExistingFilesAndDirectories

En el siguiente ejemplo de código se muestra cómo crear archivos y directorios en un almacén aislado. Primero, se recupera un almacén aislado por usuario, dominio y ensamblado, y se ubica en la variable isoStore. Se usa el método CreateDirectory para configurar unos cuantos directorios distintos y el método IsolatedStorageFileStream para crear archivos en estos directorios. A continuación, el código recorre los resultados del método GetAllDirectories. Este método usa GetDirectoryNames para buscar todos los nombres de directorio del directorio actual. Estos nombres se guardan en una matriz y, a continuación, GetAllDirectories se llama a sí mismo y pasa todos los directorios que ha encontrado. El resultado devuelto es una matriz con todos los nombres de directorio. Después, el código llama al método GetAllFiles. Este método llama a GetAllDirectories para averiguar los nombres de todos los directorios y busca los archivos en todos estos directorios, mediante el método GetFileNames. El resultado se devuelve en una matriz para su presentación.

Imports System
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Collections

Public Module modmain
   ' These arrayLists hold the directory and file names as they are found.

   Dim directoryList As New ArrayList()
   Dim fileList As New ArrayList()

   ' Retrieves an array of all directories in the store, and 
   ' displays the results.

   Sub Main()

      ' This part of the code sets up a few directories and files in the
      ' store.

      Dim isoStore As IsolatedStorageFile
      isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User Or IsolatedStorageScope.Assembly Or IsolatedStorageScope.Domain, Nothing, Nothing)

      isoStore.CreateDirectory("TopLevelDirectory")
      isoStore.CreateDirectory("TopLevelDirectory/SecondLevel")
      isoStore.CreateDirectory("AnotherTopLevelDirectory/InsideDirectory")

      Dim aStream As New IsolatedStorageFileStream("InTheRoot.txt", FileMode.Create, isoStore)
      Dim bStream As New IsolatedStorageFileStream("AnotherTopLevelDirectory/InsideDirectory/HereIAm.txt", FileMode.Create, isoStore)
      ' End of setup.

      Console.WriteLine()
      Console.WriteLine("Here is a list of all directories in this isolated store:")

      Call GetAllDirectories("*", isoStore)

      Dim directory As String
      For Each directory In directoryList
         console.WriteLine(directory)
      Next

      Console.WriteLine()
      Console.WriteLine("Retrieve all the files in the directory by calling the GetFiles method.")
      Dim file As String

      Call GetAllFiles(isoStore)
      For Each file In fileList
         Console.WriteLine(file)
      Next

   End Sub

   Sub GetAllDirectories(ByVal pattern As String, ByVal storeFile As IsolatedStorageFile)

      ' Retrieve directories.

      Dim directories As String()
      directories = storeFile.GetDirectoryNames(pattern)
      Dim directory As String

      For Each directory In directories

         ' Add the directory to the final list.

         directoryList.Add((pattern.TrimEnd(CChar("*"))) + directory + "/")

         ' Call the method again using directory.

         GetAllDirectories((pattern.TrimEnd(CChar("*")) + directory + "/"), storeFile)

      Next

   End Sub

   Sub GetAllFiles(ByVal storefile As IsolatedStorageFile)

      ' This adds the root to the directory list.

      directoryList.Add("*")

      Dim directory As String

      For Each directory In directoryList

         Dim files As String()
         files = storefile.GetFileNames(directory + "*")
         Dim File As String

         For Each File In files
            fileList.Add(File)
         Next

      Next

   End Sub
End Module
using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Collections;

public class FindingExistingFilesAndDirectories{

   // Retrieves an array of all directories in the store, and 
   // displays the results.

   public static void Main(){

      // This part of the code sets up a few directories and files in the
      // store.
      IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
      isoStore.CreateDirectory("TopLevelDirectory");
      isoStore.CreateDirectory("TopLevelDirectory/SecondLevel");
      isoStore.CreateDirectory("AnotherTopLevelDirectory/InsideDirectory");
      new IsolatedStorageFileStream("InTheRoot.txt", FileMode.Create, isoStore);
      new IsolatedStorageFileStream("AnotherTopLevelDirectory/InsideDirectory/HereIAm.txt", FileMode.Create, isoStore);
      // End of setup.

      Console.WriteLine('\r');
      Console.WriteLine("Here is a list of all directories in this isolated store:");

      foreach(string directory in GetAllDirectories("*", isoStore)){
         Console.WriteLine(directory);
      }
      Console.WriteLine('\r');

      // Retrieve all the files in the directory by calling the GetFiles 
      // method.

      Console.WriteLine("Here is a list of all the files in this isolated store:");
      foreach(string file in GetAllFiles("*", isoStore)){
         Console.WriteLine(file);
      }  

   }// End of Main.
  
   // Method to retrieve all directories, recursively, within a store.

   public static string[] GetAllDirectories(string pattern, IsolatedStorageFile storeFile){

      // Get the root of the search string.

      string root = Path.GetDirectoryName(pattern);

      if (root != "") root += "/";

      // Retrieve directories.

      string[] directories;

      directories = storeFile.GetDirectoryNames(pattern);

      ArrayList directoryList = new ArrayList(directories);

      // Retrieve subdirectories of matches.

      for (int i = 0, max = directories.Length; i < max; i++){
         string directory = directoryList[i] + "/";
         string[] more = GetAllDirectories (root + directory + "*", storeFile);

         // For each subdirectory found, add in the base path.

         for (int j = 0; j < more.Length; j++)
            more[j] = directory + more[j];

         // Insert the subdirectories into the list and 
         // update the counter and upper bound.

         directoryList.InsertRange(i+1, more);
         i += more.Length;
         max += more.Length;
      }

      return (string[])directoryList.ToArray(Type.GetType("System.String"));
   }

   public static string[] GetAllFiles(string pattern, IsolatedStorageFile storeFile){

      // Get the root and file portions of the search string.

      string fileString = Path.GetFileName(pattern);

      string[] files;
      files = storeFile.GetFileNames(pattern);

      ArrayList fileList = new ArrayList(files);

      // Loop through the subdirectories, collect matches, 
      // and make separators consistent.

      foreach(string directory in GetAllDirectories( "*", storeFile))
         foreach(string file in storeFile.GetFileNames(directory + "/" + fileString))
            fileList.Add((directory + "/" + file));

      return (string[])fileList.ToArray(Type.GetType("System.String"));
         
   }// End of GetFiles.

}

Vea también

Referencia

IsolatedStorageFile

Otros recursos

Realizar tareas de almacenamiento aislado