Untitled

From Queen Ibis, 1 Year ago, written in Plain Text, viewed 238 times.
URL http://putcode.com/view/6167a91d Embed
Download Paste or View Raw
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Collections.Concurrent;
  8. using System.Security.Cryptography;
  9. using System.Threading;
  10. using Newtonsoft.Json;
  11. using ExifLib;
  12. using RestSharp;
  13.  
  14. namespace MovePhotoConsole
  15. {
  16.     public class FileInfoChecksum
  17.     {
  18.         public string DirectoryName { get; set; }
  19.         public string Checksum { get; set; }
  20.         public string FullPath { get; set; }
  21.         public string Name { get;set;}
  22.         public long FileSize { get; set; }
  23.        
  24.     }
  25.  
  26.  
  27.  
  28.     class Program
  29.     {
  30.         private static string GetHashSha256(string filename)
  31.         {
  32.             SHA256 Sha256 = SHA256.Create();
  33.             using (FileStream stream = File.OpenRead(filename))
  34.             {
  35.                 return BitConverter.ToString(Sha256.ComputeHash(stream)).Replace("-", string.Empty);
  36.             }
  37.         }
  38.  
  39.  
  40.         public static void MakeFile()
  41.         {
  42.             List<string> ignoreExtensions = new List<string>
  43.             {
  44.                 ".avi",".mp4",".MOV",".mkv",".ini",".MTS" ,  ".m4v"
  45.             };
  46.             string path = @"G:\Test";
  47.  
  48.             DirectoryInfo dirInfo = new DirectoryInfo(path);
  49.  
  50.             List<FileInfo> fileDetails = dirInfo.GetFiles("*", SearchOption.AllDirectories).ToList();
  51.             fileDetails = fileDetails.OrderByDescending(x => x.Length).ToList();
  52.             int removed = fileDetails.RemoveAll(x => ignoreExtensions.Contains(x.Extension));
  53.  
  54.  
  55.             int done = 0;
  56.             ConcurrentBag<FileInfoChecksum> extendedFileInfo = new ConcurrentBag<FileInfoChecksum>();
  57.             Parallel.ForEach(fileDetails, info =>
  58.             {
  59.                 extendedFileInfo.Add(new FileInfoChecksum { Checksum = GetHashSha256(info.FullName), DirectoryName = info.DirectoryName, FileSize = info.Length, FullPath = info.FullName, Name = info.Name });
  60.                 Interlocked.Increment(ref done);
  61.                 Console.WriteLine(string.Format("{0}/{1}", done, fileDetails.Count));
  62.  
  63.             });
  64.  
  65.  
  66.             List<string> jsonRecords = new List<string>();
  67.             foreach (FileInfoChecksum current in extendedFileInfo)
  68.             {
  69.                 jsonRecords.Add(JsonConvert.SerializeObject(current));
  70.             }
  71.             System.IO.File.WriteAllLines(@"C:\Temp\WriteLines.txt", jsonRecords);
  72.             Console.WriteLine("File Made");
  73.         }
  74.  
  75.  
  76.         public static void ReadFile()
  77.         {
  78.             string destination = @"G:\Moved\";
  79.             string path = @"C:\Temp\WriteLines.txt";
  80.             List<string> lines = System.IO.File.ReadAllLines(@"C:\Temp\WriteLines.txt").ToList();
  81.             List <FileInfoChecksum> fileInfo = lines.Select(x => JsonConvert.DeserializeObject<FileInfoChecksum>(x)).ToList();
  82.             Console.WriteLine(fileInfo);
  83.             var grouping = fileInfo.GroupBy(x => x.Checksum);
  84.             int done = 0;
  85.             int count = grouping.Count();
  86.             int duplicates = 0;
  87.             foreach (var group in grouping)
  88.             {
  89.                 List<long> fileSizes = group.Select(x => x.FileSize).Distinct().ToList();
  90.                 if(fileSizes.Count > 1)
  91.                 {
  92.                     Console.WriteLine("Multiple");
  93.                 }
  94.                 else
  95.                 {
  96.                     if(File.Exists(destination + group.First().Name))
  97.                     {
  98.                         duplicates++;
  99.                         string extension = Path.GetExtension(group.First().FullPath);
  100.                         string newName = Path.GetFileNameWithoutExtension(group.First().FullPath);
  101.                         newName = newName + "_d" + duplicates + extension;
  102.  
  103.                         File.Copy(group.First().FullPath, destination + newName);
  104.                     }
  105.                     else
  106.                     {
  107.                         File.Copy(group.First().FullPath, destination + group.First().Name);
  108.                     }
  109.  
  110.  
  111.                 }
  112.  
  113.                 Console.WriteLine(string.Format("{0}/{1}", done++, count));
  114.             }
  115.  
  116.             Console.WriteLine("Checked");
  117.  
  118.         }
  119.  
  120.         public static double[] GetLatLongFromImage(string imagePath)
  121.         {
  122.             try
  123.             {
  124.                 ExifReader reader = new ExifReader(imagePath);
  125.  
  126.                 // EXIF lat/long tags stored as [Degree, Minute, Second]
  127.                 double[] latitudeComponents;
  128.                 double[] longitudeComponents;
  129.  
  130.                 string latitudeRef; // "N" or "S" ("S" will be negative latitude)
  131.                 string longitudeRef; // "E" or "W" ("W" will be a negative longitude)
  132.  
  133.                 if (reader.GetTagValue(ExifTags.GPSLatitude, out latitudeComponents)
  134.                     && reader.GetTagValue(ExifTags.GPSLongitude, out longitudeComponents)
  135.                     && reader.GetTagValue(ExifTags.GPSLatitudeRef, out latitudeRef)
  136.                     && reader.GetTagValue(ExifTags.GPSLongitudeRef, out longitudeRef))
  137.                 {
  138.  
  139.                     var latitude = ConvertDegreeAngleToDouble(latitudeComponents[0], latitudeComponents[1], latitudeComponents[2], latitudeRef);
  140.                     var longitude = ConvertDegreeAngleToDouble(longitudeComponents[0], longitudeComponents[1], longitudeComponents[2], longitudeRef);
  141.                     reader.Dispose();
  142.                     return new[] { latitude, longitude };
  143.                 }
  144.                 reader.Dispose();
  145.                 return null;
  146.             }
  147.             catch(Exception exp)
  148.             {
  149.                 return null;
  150.             }
  151.         }
  152.  
  153.         public static double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds, string latLongRef)
  154.         {
  155.             double result = ConvertDegreeAngleToDouble(degrees, minutes, seconds);
  156.             if (latLongRef == "S" || latLongRef == "W")
  157.             {
  158.                 result *= -1;
  159.             }
  160.             return result;
  161.         }
  162.  
  163.         public static double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds)
  164.         {
  165.             return degrees + (minutes / 60) + (seconds / 3600);
  166.         }
  167.  
  168.  
  169.  
  170.         public static void SortFiles()
  171.         {
  172.             string path = @"G:\Moved\";
  173.             string unknownLocation = @"G:\Moved\Unknown\";
  174.             DirectoryInfo dirInfo = new DirectoryInfo(path);
  175.             List<FileInfo> fileDetails = dirInfo.GetFiles("*", SearchOption.AllDirectories).ToList();
  176.  
  177.             RestClient client = new RestClient("http://maps.googleapis.com/");
  178.  
  179.  
  180.             foreach (FileInfo currentFile in fileDetails)
  181.             {
  182.                 double[] pos = GetLatLongFromImage(currentFile.FullName);
  183.                 if(pos != null)
  184.                 {
  185.                     RestRequest request = new RestRequest("maps/api/geocode/json?", Method.GET);
  186.                    
  187.                     request.AddParameter(new Parameter { Name = "latlng", Value = string.Format("{0},{1}", pos[0], pos[1]) , Type = ParameterType.QueryString });
  188.                     var resp = client.Execute(request);
  189.                     GoogleResult locationDetails = JsonConvert.DeserializeObject<GoogleResult>(resp.Content);
  190.                     if (locationDetails != null && locationDetails.results.Any())
  191.                     {
  192.                         var countries = locationDetails.results.First().address_components.Where(x => x.types.Any(y => y == "country"));
  193.                         string country = countries.First().long_name;
  194.                         string countryDirectory = path + country;
  195.                         if (!Directory.Exists(countryDirectory))
  196.                         {
  197.                             Directory.CreateDirectory(countryDirectory);
  198.                         }
  199.  
  200.                         File.Move(currentFile.FullName, countryDirectory + @"\" + currentFile.Name);
  201.  
  202.                     }
  203.                     else
  204.                     {
  205.                         File.Move(currentFile.FullName, unknownLocation + currentFile.Name);
  206.                     }
  207.  
  208.  
  209.                 }
  210.                 else
  211.                 {
  212.                     File.Move(currentFile.FullName , unknownLocation + currentFile.Name);
  213.                 }
  214.  
  215.  
  216.  
  217.             }
  218.  
  219.  
  220.  
  221.  
  222.         }
  223.  
  224.         static void Main(string[] args)
  225.         {
  226.             ReadFile();
  227.             //SortFiles();
  228.  
  229.             //var grouping = extendedFileInfo.GroupBy(x => x.Checksum).ToList();
  230.             //Console.WriteLine(grouping);
  231.  
  232.             //var test = grouping.Where(x => x.Count() > 1);
  233.             //Console.WriteLine(test);
  234.  
  235.         }
  236.     }
  237. }
  238.  

Reply to "Untitled"

Here you can reply to the paste above

captcha