This documentation is archived and is not being maintained.

How to: Find Existing Files and Directories in Isolated Storage

You can also search for existing directories and files using an isolated storage file. Remember that within a store, file and directory names are specified with respect to the root of the virtual file system. Also, file and directory names in the Windows file systems are case-insensitive.

To search for a directory, use the GetDirectoryNames instance method of IsolatedStorageFile. GetDirectoryNames takes a string representing a search pattern. Both single-character (?) and multi-character (*) wildcard characters are supported. These wildcard characters cannot appear in the path portion of the name; that is, directory1/*ect* is a valid search string, but *ect*/directory2 is not.

To search for a file, use the GetFileNames instance method of IsolatedStorageFile. The same restriction for wildcard characters in search strings that applies to GetDirectoryNames also applies to GetFileNames.

Neither GetDirectoryNames nor GetFileNames is recursive; that is, IsolatedStorageFile does not supply methods for listing all directories or files in your store. However, examples of recursive methods are part of the code below. Also note that both GetDirectoryNames and GetFileNames return only the directory or file name of the item found. For example, if there is a match on the directory RootDir/SubDir/SubSubDir, SubSubDir will be returned in the results array.

The following code example illustrates how to create files and directories in an isolated store. First, a store isolated for user, domain, and assembly is retrieved and placed in the isoStore variable. The CreateDirectory method is used to set up a few different directories and the IsolatedStorageFileStream method creates some files in these directories. The code then loops through the results of the GetAllDirectories method. This method uses GetDirectoryNames to find all the directory names in the current directory. These names are stored in an array, and then GetAllDirectories calls itself, passing in each of the directories it has found. The result is all the directory names returned in an array. Next, the code calls the GetAllFiles method. This method calls GetAllDirectories to find out the names of all the directories, and then it checks each of these directories for files using the GetFileNames method. The result is returned in an array for display.

using namespace System;
using namespace System::IO;
using namespace System::IO::IsolatedStorage;
using namespace System::Collections;
using namespace System::Collections::Generic;

public class FindingExistingFilesAndDirectories
    // 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);
        gcnew IsolatedStorageFileStream("InTheRoot.txt", FileMode::Create, isoStore);
        gcnew IsolatedStorageFileStream("AnotherTopLevelDirectory/InsideDirectory/HereIAm.txt",
            FileMode::Create, isoStore);
        // End of setup.

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

        for each (String^ directory in GetAllDirectories("*", isoStore))

        // 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))

    } // 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()