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); } }