/// <summary> /// Constructor /// </summary> /// <param name="pathBlocksIp">Ruta de bloques ip</param> /// <param name="pathLocations">Ruta de posiciones</param> public GeoLite2LocationProvider(string pathBlocksIp, string pathLocations) { if (File.Exists(pathBlocksIp) && File.Exists(pathLocations)) { Dictionary <long, GeoLocateResult> data = new Dictionary <long, GeoLocateResult>(); using (Stream fs = CompressHelper.UnGzFile(pathLocations)) using (StreamReader sr = new StreamReader(fs)) { Parallel.ForEach <string>(LineGenerator(sr), line => { string[] sp = line.Split(','); if (sp.Length <= 0) { return; } long c; if (long.TryParse(sp[0], out c)) { switch (sp.Length) { case 6: { // Archivo de paises GeoLocateResult add = new GeoLocateResult(sp[2] + "-" + sp[4], (string.IsNullOrEmpty(sp[3]) ? "" : sp[3] + " - ") + sp[5]); lock (data) data.Add(c, add); break; } case 13: { // Archivo de paises y poblaciones GeoLocateResult add = new GeoLocateResult(sp[2] + "-" + sp[4], (string.IsNullOrEmpty(sp[12]) ? "" : sp[12] + " - ") + sp[5]); lock (data) data.Add(c, add); break; } } } } ); } List <geoIp> l = new List <geoIp>(); using (Stream fs = CompressHelper.UnGzFile(pathBlocksIp)) using (StreamReader sr = new StreamReader(fs)) { Parallel.ForEach <string>(LineGenerator(sr), line => { string[] sp = line.Split(','); // El archivo grande y pequeño están organizados igual if (sp.Length != 10 && sp.Length != 6) { return; } long c; GeoLocateResult r; if (long.TryParse(sp[2], out c) && data.TryGetValue(c, out r)) { IPNetwork net; if (IPNetwork.TryParse(sp[0], out net)) { geoIp add = new geoIp(net, r); lock (l) l.Add(add); } } } ); } _Locates = l.ToArray(); } }
public geoIp(IPNetwork network, GeoLocateResult data) { Network = network; Result = data; }