public static string FindFilePath(this ID id, DirectoryInfo serializationFolder)
 {
     lock (_pathSets)
     {
         // find or create the set of paths for the serialization folder
         SerializedIdToPathSet pathSet;
         if (_pathSets.ContainsKey(serializationFolder.FullName))
         {
             pathSet = _pathSets[serializationFolder.FullName];
         }
         else
         {
             pathSet = new SerializedIdToPathSet();
             pathSet.FilePaths.Push(serializationFolder.FullName);
             _pathSets.Add(serializationFolder.FullName, pathSet);
         }
         // get the individual item if already found
         if (pathSet.Paths.ContainsKey(id))
         {
             return pathSet.Paths[id];
         }
         while (pathSet.FilePaths.Any())
         {
             string filePath = pathSet.FilePaths.Pop();
             foreach (string subdirectory in Directory.GetDirectories(filePath))
             {
                 pathSet.FilePaths.Push(subdirectory);
             }
             string foundFile = null;
             foreach (string file in Directory.GetFiles(filePath, "*.item"))
             {
                 using (StreamReader sr = new StreamReader(file))
                 {
                     sr.ReadLine();
                     sr.ReadLine();
                     string itemIdStr = sr.ReadLine().Substring(4);
                     if (ID.IsID(itemIdStr))
                     {
                         ID itemId = ID.Parse(itemIdStr);
                         if (!pathSet.Paths.ContainsKey(itemId))
                         {
                             pathSet.Paths.Add(itemId, file);
                             if (itemId == id)
                             {
                                 foundFile = file;
                             }
                         }
                     }
                 }
             }
             if (foundFile != null)
             {
                 return foundFile;
             }
         }
         return null;
     }
 }
 public static string FindFilePath(this ID id, DirectoryInfo serializationFolder)
 {
     lock (_pathSets)
     {
         // find or create the set of paths for the serialization folder
         SerializedIdToPathSet pathSet;
         if (_pathSets.ContainsKey(serializationFolder.FullName))
         {
             pathSet = _pathSets[serializationFolder.FullName];
         }
         else
         {
             pathSet = new SerializedIdToPathSet();
             pathSet.FilePaths.Push(serializationFolder.FullName);
             _pathSets.Add(serializationFolder.FullName, pathSet);
         }
         // get the individual item if already found
         if (pathSet.Paths.ContainsKey(id))
         {
             return(pathSet.Paths[id]);
         }
         while (pathSet.FilePaths.Any())
         {
             string filePath = pathSet.FilePaths.Pop();
             foreach (string subdirectory in Directory.GetDirectories(filePath))
             {
                 pathSet.FilePaths.Push(subdirectory);
             }
             string foundFile = null;
             foreach (string file in Directory.GetFiles(filePath, "*.item"))
             {
                 using (StreamReader sr = new StreamReader(file))
                 {
                     sr.ReadLine();
                     sr.ReadLine();
                     string itemIdStr = sr.ReadLine().Substring(4);
                     if (ID.IsID(itemIdStr))
                     {
                         ID itemId = ID.Parse(itemIdStr);
                         if (!pathSet.Paths.ContainsKey(itemId))
                         {
                             pathSet.Paths.Add(itemId, file);
                             if (itemId == id)
                             {
                                 foundFile = file;
                             }
                         }
                     }
                 }
             }
             if (foundFile != null)
             {
                 return(foundFile);
             }
         }
         return(null);
     }
 }