|
@@ -15,7 +15,7 @@ namespace PhotoSorter
|
|
|
{
|
|
|
string postfix = "Hansi";
|
|
|
|
|
|
- Console.WriteLine("This application can sort photos in CURRENT directory by exif shotdate, move the photos to sub-Directory which created by date. Hansi 2017-10-01");
|
|
|
+ Console.WriteLine("This application can sort photos in CURRENT and sub directory by EXIF shotdate Or it's Filename, move the photos to a NEW sub-Directory which created by date like \"2017-10-01\". Hansi 2017-10-21");
|
|
|
Console.WriteLine("Press any key to DO it...");
|
|
|
Console.ReadKey();
|
|
|
string folderIn = AppDomain.CurrentDomain.BaseDirectory;
|
|
@@ -28,20 +28,27 @@ namespace PhotoSorter
|
|
|
foreach (var file in files)
|
|
|
{
|
|
|
k++;
|
|
|
- Console.WriteLine(k.ToString() + "/" + files.Length.ToString());
|
|
|
-
|
|
|
FileInfo fi = new FileInfo(file);
|
|
|
-
|
|
|
+ Console.WriteLine(k.ToString() + "/" + files.Length.ToString() + "\t" + fi.Name);
|
|
|
string newFileName;
|
|
|
if ((fi.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
|
|
|
{
|
|
|
var dateTaken = GetDateTakenFromImage(file);
|
|
|
if (dateTaken == DateTime.MinValue)
|
|
|
{
|
|
|
- continue;
|
|
|
+ Console.WriteLine("ignore " + fi.Name + ":Get Exif Fail");
|
|
|
+ Console.WriteLine("Trying to get Date From filename...");
|
|
|
+ dateTaken = GetDateFromImageFileName(file);
|
|
|
+ if (dateTaken == DateTime.MinValue)
|
|
|
+ {
|
|
|
+ Console.WriteLine("ignore " + fi.Name + ":Get Date By File Name Fail");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
if (Path.GetExtension(file).ToLower() != ".jpg")
|
|
|
{
|
|
|
+ Console.WriteLine("ignore " + fi.Name + "NOT jpg File");
|
|
|
continue;
|
|
|
}
|
|
|
//dateTaken = dateTaken.AddHours(hourOffset);
|
|
@@ -89,20 +96,41 @@ namespace PhotoSorter
|
|
|
/// <returns></returns>
|
|
|
public static DateTime GetDateTakenFromImage(string path)
|
|
|
{
|
|
|
- using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
|
|
|
- using (Image myImage = Image.FromStream(fs, false, false))
|
|
|
+ try
|
|
|
{
|
|
|
- try
|
|
|
+ using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
|
|
|
+ using (Image myImage = Image.FromStream(fs, false, false))
|
|
|
{
|
|
|
PropertyItem propItem = myImage.GetPropertyItem(36867);
|
|
|
string dateTaken = r.Replace(Encoding.UTF8.GetString(propItem.Value), "-", 2);
|
|
|
return DateTime.Parse(dateTaken);
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- return DateTime.MinValue;
|
|
|
- }
|
|
|
}
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ Console.WriteLine(ex.Message);
|
|
|
+ return DateTime.MinValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static DateTime GetDateFromImageFileName(string path)
|
|
|
+ {
|
|
|
+ //not finished try to get name from filename. yyyyMMdd or yyyy-MM-dd
|
|
|
+ string fn = Path.GetFileNameWithoutExtension(path);
|
|
|
+ Regex r1 = new Regex(@"20\d{6}");
|
|
|
+ Regex r2 = new Regex(@"20\d{2}-\d{2}-\d{2}");
|
|
|
+ if (r1.IsMatch(fn))
|
|
|
+ {
|
|
|
+ string ff = r1.Match(fn).Value;
|
|
|
+ return DateTime.Parse(ff.Substring(0,4)+"/" + ff.Substring(4,2) + "/" + ff.Substring(6,2));
|
|
|
+ }
|
|
|
+ if (r2.IsMatch(fn))
|
|
|
+ {
|
|
|
+ string ff = r2.Match(fn).Value;
|
|
|
+ return DateTime.Parse(ff);
|
|
|
+ }
|
|
|
+
|
|
|
+ return DateTime.MinValue;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|