Procedura: trovare file e directory esistenti nello spazio di memorizzazione isolato
È possibile cercare directory e file esistenti utilizzando un file di archiviazione isolata. Si tenga presente che all'interno di un archivio, i nomi di file e directory vengono specificati in relazione alla radice del file system virtuale. In file system Windows il confronto dei nomi di file e directory non distingue tra maiuscole e minuscole.
Per cercare una directory, utilizzare il metodo di istanza GetDirectoryNames di IsolatedStorageFile. GetDirectoryNames accetta una stringa che rappresenta un modello di ricerca. Sono supportati sia i caratteri jolly che rappresentano un solo carattere (?) che quelli che rappresentano più caratteri (*). Non è possibile utilizzare i caratteri jolly nella parte del nome che identifica il percorso. Pertanto, directory1/*ect* è una stringa di ricerca valida, ma *ect*/directory2 non lo è.
Per cercare un file, utilizzare il metodo di istanza GetFileNames di IsolatedStorageFile. Anche per GetFileNames vale la stessa restrizione descritta per GetDirectoryNames relativamente all'utilizzo dei caratteri jolly nelle stringhe di ricerca.
GetDirectoryNames e GetFileNames non sono ricorsivi, pertanto IsolatedStorageFile non fornisce metodi che consentono di elencare tutte le directory o i file dell'archivio. Tuttavia, nel codice riportato di seguito vengono illustrati anche esempi di metodi ricorsivi. Si noti inoltre che GetDirectoryNames e GetFileNames restituiscono solo il nome della directory o del file dell'elemento trovato. Se ad esempio esiste una corrispondenza nella directory RootDir/SubDir/SubSubDir, nella matrice dei risultati verrà restituito SubSubDir.
Esempio di utilizzo di FindingExistingFilesAndDirectories
Nell'esempio di codice che segue viene illustrato come creare file e directory in un archivio isolato. In primo luogo viene recuperato e inserito nella variabile isoStore un archivio isolato in base all'utente, al dominio e all'assembly. Vengono utilizzati il metodo CreateDirectory per creare alcune directory e il metodo IsolatedStorageFileStream per creare alcuni file all'interno di tali directory. Il codice consente quindi di scorrere i risultati del metodo GetAllDirectories. Il metodo utilizza GetDirectoryNames per trovare tutti i nomi delle directory contenute nella directory corrente. Tali nomi vengono memorizzati in una matrice, quindi GetAllDirectories chiama se stesso passando tutte le directory trovate. Il risultato è rappresentato da una matrice contenente i nomi di tutte le directory. A questo punto il codice chiama il metodo GetAllFiles. Tale metodo chiama GetAllDirectories per trovare i nomi di tutte le directory e quindi cerca i file contenuti in ciascuna di queste directory utilizzando il metodo GetFileNames. Il risultato viene restituito in una matrice il cui contenuto verrà successivamente visualizzato.
Imports System
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Collections
Imports System.Collections.Generic
Public class FindingExistingFilesAndDirectories
' These arrayLists hold the directory and file names as they are found.
Private Shared directoryList As New List(Of String)
Private Shared fileList As New List(Of String)
' Retrieves an array of all directories in the store, and
' displays the results.
Public Shared Sub Main()
' This part of the code sets up a few directories and files in the store.
Dim isoStore As IsolatedStorageFile = 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:")
GetAllDirectories("*", isoStore)
For Each directory As String In directoryList
Console.WriteLine(directory)
Next
Console.WriteLine()
Console.WriteLine("Retrieve all the files in the directory by calling the GetFiles method.")
GetAllFiles(isoStore)
For Each file As String In fileList
Console.WriteLine(file)
Next
End Sub
Public Shared Sub GetAllDirectories(ByVal pattern As String, ByVal storeFile As IsolatedStorageFile)
' Retrieve directories.
Dim directories As String() = storeFile.GetDirectoryNames(pattern)
For Each directory As String 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
Public Shared Sub GetAllFiles(ByVal storefile As IsolatedStorageFile)
' This adds the root to the directory list.
directoryList.Add("*")
For Each directory As String In directoryList
Dim files As String() = storefile.GetFileNames(directory + "*")
For Each dirfile As String In files
fileList.Add(dirfile)
Next
Next
End Sub
End Class
using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Collections;
using System.Collections.Generic;
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 List<String> GetAllDirectories(string pattern, IsolatedStorageFile storeFile)
{
// Get the root of the search string.
string root = Path.GetDirectoryName(pattern);
if (root != "")
{
root += "/";
}
// Retrieve directories.
List<String> directoryList = new List<String>(storeFile.GetDirectoryNames(pattern));
// Retrieve subdirectories of matches.
for (int i = 0, max = directoryList.Count; i < max; i++)
{
string directory = directoryList[i] + "/";
List<String> more = GetAllDirectories(root + directory + "*", storeFile);
// For each subdirectory found, add in the base path.
for (int j = 0; j < more.Count; 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.Count;
max += more.Count;
}
return directoryList;
}
public static List<String> GetAllFiles(string pattern, IsolatedStorageFile storeFile)
{
// Get the root and file portions of the search string.
string fileString = Path.GetFileName(pattern);
List<String> fileList = new List<String>(storeFile.GetFileNames(pattern));
// 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 fileList;
} // End of GetFiles.
}
using namespace System;
using namespace System::IO;
using namespace System::IO::IsolatedStorage;
using namespace System::Collections;
using namespace System::Collections::Generic;
public class FindingExistingFilesAndDirectories
{
public:
// Retrieves an array of all directories in the store, and
// displays the results.
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, (Type ^)nullptr, (Type ^)nullptr);
isoStore->CreateDirectory("TopLevelDirectory");
isoStore->CreateDirectory("TopLevelDirectory/SecondLevel");
isoStore->CreateDirectory("AnotherTopLevelDirectory/InsideDirectory");
gcnew IsolatedStorageFileStream("InTheRoot.txt", FileMode::Create, isoStore);
gcnew 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:");
for each (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:");
for each (String^ file in GetAllFiles("*", isoStore))
{
Console::WriteLine(file);
}
} // End of Main.
// Method to retrieve all directories, recursively, within a store.
static List<String^>^ GetAllDirectories(String^ pattern, IsolatedStorageFile^ storeFile)
{
// Get the root of the search string.
String^ root = Path::GetDirectoryName(pattern);
if (root != "")
{
root += "/";
}
// Retrieve directories.
array<String^>^ directories = storeFile->GetDirectoryNames(pattern);
List<String^>^ directoryList = gcnew List<String^>(directories);
// Retrieve subdirectories of matches.
for (int i = 0, max = directories->Length; i < max; i++)
{
String^ directory = directoryList[i] + "/";
List<String^>^ more = GetAllDirectories (root + directory + "*", storeFile);
// For each subdirectory found, add in the base path.
for (int j = 0; j < more->Count; 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->Count;
max += more->Count;
}
return directoryList;
}
static List<String^>^ GetAllFiles(String^ pattern, IsolatedStorageFile^ storeFile)
{
// Get the root and file portions of the search string.
String^ fileString = Path::GetFileName(pattern);
array<String^>^ files = storeFile->GetFileNames(pattern);
List<String^>^ fileList = gcnew List<String^>(files);
// Loop through the subdirectories, collect matches,
// and make separators consistent.
for each (String^ directory in GetAllDirectories( "*", storeFile))
{
for each (String^ file in storeFile->GetFileNames(directory + "/" + fileString))
{
fileList->Add((directory + "/" + file));
}
}
return fileList;
} // End of GetFiles.
};
int main()
{
FindingExistingFilesAndDirectories::Main();
}