/// <summary> /// 指定されたinfoからCookieを取得するICookieImporterを生成します。 /// 継承時にコンストラクタでcookiePathType, primaryLevelを直接指定し、 /// infoの方は引数で受け取る形にする事を推奨します。 /// </summary> /// <param name="info">対象のブラウザの構成情報</param> /// <param name="cookiePathType">対象ブラウザのCookieの置き場所の形式</param> /// <param name="primaryLevel"> /// 並べ替え時に用いられる数値。 /// OSブラウザ: 0、有名ブラウザ: 1、派生ブラウザ: 2 /// </param> public CookieImporterBase(CookieSourceInfo info, CookiePathType cookiePathType, int primaryLevel) { if (info == null) throw new ArgumentNullException("引数infoがnullです。"); SourceInfo = info; CookiePathType = cookiePathType; PrimaryLevel = primaryLevel; }
/// <summary> /// 指定されたinfoからCookieを取得するICookieImporterを生成します。 /// 継承時にコンストラクタでcookiePathType, primaryLevelを直接指定し、 /// infoの方は引数で受け取る形にする事を推奨します。 /// </summary> /// <param name="info">対象のブラウザの構成情報</param> /// <param name="cookiePathType">対象ブラウザのCookieの置き場所の形式</param> /// <param name="primaryLevel"> /// 並べ替え時に用いられる数値。 /// OSブラウザ: 0、有名ブラウザ: 1、派生ブラウザ: 2 /// </param> public CookieImporterBase(CookieSourceInfo info, CookiePathType cookiePathType, int primaryLevel) { if (info == null) { throw new ArgumentNullException("引数infoがnullです。"); } SourceInfo = info; CookiePathType = cookiePathType; PrimaryLevel = primaryLevel; }
static IEnumerable <string> FindTargets(string dirPath, string targetName, CookiePathType fileType) { /* 中身を探索し、ユーザデータを探す。 * ガイドライン的にフォルダは以下の構造になっていると予想される。 * > (%APPDATA%|%LOCALAPPDATA%)\(ProductName\){1,3}User Data\(ProfileName)\Cookies etc.. * > 参考文献: http://d.hatena.ne.jp/torutk/20110604/p1 * * そのため、探索は製品フォルダから2階層下まで見る。 * ユーザデータを発見したらその中身は探索しない。しかし、同一ベンダ、同一製品で複数の * 系統というのは存在しうるため、兄弟フォルダなどの探索は継続する。 */ var searchingPaths = new Stack <string>(new[] { dirPath }); var searchingLevels = new Stack <int>(new[] { 0 }); while (searchingPaths.Count > 0) { var itemLevel = searchingLevels.Pop(); var itemLongPath = searchingPaths.Pop(); var itemShrtPath = itemLongPath.Substring(dirPath.Length); var targetFilePath = Path.Combine(itemLongPath, targetName); if (fileType == CookiePathType.File ? File.Exists(targetFilePath) : Directory.Exists(targetFilePath)) { yield return(targetFilePath); continue; } //中身を2階層まで探索 //"AppData\Vender\Product\Edition"で4つ分になる。 if (itemLevel > 3) { continue; } //製品フォルダを列挙 IEnumerable <string> tmp; try { tmp = Directory.EnumerateDirectories(itemLongPath); } catch (UnauthorizedAccessException) { continue; } catch (System.Security.SecurityException) { continue; } catch (IOException) { continue; } foreach (var item in tmp) { searchingPaths.Push(item); searchingLevels.Push(itemLevel + 1); } } }
static IEnumerable<string> FindTargets(string dirPath, string targetName, CookiePathType fileType) { /* 中身を探索し、ユーザデータを探す。 * ガイドライン的にフォルダは以下の構造になっていると予想される。 * > (%APPDATA%|%LOCALAPPDATA%)\(ProductName\){1,3}User Data\(ProfileName)\Cookies etc.. * > 参考文献: http://d.hatena.ne.jp/torutk/20110604/p1 * * そのため、探索は製品フォルダから2階層下まで見る。 * ユーザデータを発見したらその中身は探索しない。しかし、同一ベンダ、同一製品で複数の * 系統というのは存在しうるため、兄弟フォルダなどの探索は継続する。 */ var searchingPaths = new Stack<string>(new[] { dirPath }); var searchingLevels = new Stack<int>(new[] { 0 }); while (searchingPaths.Count > 0) { var itemLevel = searchingLevels.Pop(); var itemLongPath = searchingPaths.Pop(); var itemShrtPath = itemLongPath.Substring(dirPath.Length); var targetFilePath = Path.Combine(itemLongPath, targetName); if (fileType == CookiePathType.File ? File.Exists(targetFilePath) : Directory.Exists(targetFilePath)) { yield return targetFilePath; continue; } //中身を2階層まで探索 //"AppData\Vender\Product\Edition"で4つ分になる。 if (itemLevel > 3) continue; //製品フォルダを列挙 IEnumerable<string> tmp; try { tmp = Directory.EnumerateDirectories(itemLongPath); } catch (UnauthorizedAccessException) { continue; } catch (System.Security.SecurityException) { continue; } catch (IOException) { continue; } foreach (var item in tmp) { searchingPaths.Push(item); searchingLevels.Push(itemLevel + 1); } } }
/// <summary> /// パターンを入力してインスタンスを生成します。 /// </summary> /// <param name="searchTarget">検索する対象の名前</param> /// <param name="targetType">対象の種類</param> public SmartImporterFactory(string searchTarget, CookiePathType targetType) { _searchTarget = searchTarget; _targetType = targetType; }