Files

330 lines
12 KiB
C#

using MetadataExtractor;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PictureReposit
{
public partial class Form1 : Form
{
private bool Deleting = false;
public Form1()
{
InitializeComponent();
RegistryKey PictureHandling = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Tfoman\PictureReposit");
if (PictureHandling == null)
{
txtRootDir.Text = @"D:\Bildlabb\LabRotCat";
}
else
{
txtRootDir.Text = (string)PictureHandling.GetValue(@"RootMap");
}
}
private void btnFileDialog_Click(object sender, EventArgs e)
{
openFileDialog1.Title = "Välj bild-fil!";
openFileDialog1.InitialDirectory = "C:\\";
openFileDialog1.Filter = "Picture files (*.jpg)|*.jpg|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
openFileDialog1.ShowDialog();
openFileDialog1.Multiselect = false;
string fName = openFileDialog1.FileName;
if (fName.Trim() != "")
{
int fNamePos = fName.LastIndexOf(@"\") + 1;
lblFileName.Text = fName.Substring(fNamePos);
lblPath.Text = fName.Substring(0, fNamePos);
listLocalFiles();
for (int i = 0; i < lstPicFiles.Items.Count; i++)
{
if (lstPicFiles.Items[i].ToString() == lblFileName.Text)
{
lstPicFiles.SelectedIndex = i;
break;
}
}
}
}
private void listLocalFiles()
{
DirectoryInfo di = new DirectoryInfo(lblPath.Text);
FileInfo[] files = new string[] { "*.png", "*.jpg", "*.jpeg", "*.img", "*.mov" }
.SelectMany(i => di.GetFiles(i, SearchOption.AllDirectories))
.ToArray();
lstPicFiles.Items.Clear();
for (int i = 0; i < files.Length; i++)
{
lstPicFiles.Items.Add(files[i].Name);
}
btnReOrganize.Enabled = true;
}
private void lstPicFiles_SelectedIndexChanged(object sender, EventArgs e)
{
if (!Deleting)
{
string fName = ((ListBox)sender).SelectedItem.ToString();
lblFileName.Text = fName;
Image actPic = null;
if (fName.ToUpper().EndsWith(".MOV"))
{
actPic = Image.FromFile("IMG_2994.jpg", true);
}
else
{
actPic = Image.FromFile(lblPath.Text + fName, true);
}
lblCreated.Text = "Skapad: " + GetOrigCreateDateTimeFromMediaFile(new FileInfo(lblPath.Text + fName)).ToString(); ;
int w = actPic.Width;
int h = actPic.Height;
int pw = pictureBox1.Width;
int ph = pictureBox1.Height;
pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
Bitmap to_bm = new Bitmap((Image)actPic.Clone(), w * ph / h, ph);
pictureBox1.Image = to_bm;
actPic = null;
}
}
private void btnReOrganize_Click(object sender, EventArgs e)
{
bool slaskDir = false;
int slaskFilNr = 0;
string fromPath = lblPath.Text.Trim();
pbReorgProcess.Visible = true;
pictureBox1.Visible = false;
if (txtRootDir.Text.Trim().Substring(txtRootDir.Text.Trim().Length - 1) != @"\")
txtRootDir.Text = txtRootDir.Text.Trim() + @"\";
DirectoryInfo di = new DirectoryInfo(txtRootDir.Text);
if (!di.Exists) di.Create();
Deleting = true;
pictureBox1.Image = null;
pictureBox1.Refresh();
try
{
pbReorgProcess.Maximum = lstPicFiles.Items.Count;
pbReorgProcess.Minimum = 0;
for (int i = lstPicFiles.Items.Count - 1; i > -1; i--)
{
pbReorgProcess.Value = lstPicFiles.Items.Count-i;
string lFileName = lstPicFiles.Items[i].ToString().Trim();
string fName = fromPath + lFileName;
lblFileName.Text = fName;
FileInfo fi = new FileInfo(fName);
string td = GetOrigCreateDateTimeFromMediaFile(fi).ToString();
lblCreated.Text = "Skapad: " + td;
if (td.Trim() != DateTime.MinValue.ToString())
{
lblCreated.Text = "Skapad: " + td;
td = td.Substring(0, 10);
DateTime dttd = DateTime.Parse(td);
string subDir1 = dttd.Year.ToString("0000") + "-" + dttd.Month.ToString("00") + @"\";
string subDir2 = dttd.Year.ToString("0000") + "_" + dttd.Month.ToString("00") + "_" + dttd.Day.ToString("00") + @"\";
DirectoryInfo dis = new DirectoryInfo(di.FullName + subDir1);
if (!dis.Exists) dis.Create();
DirectoryInfo diss = new DirectoryInfo(dis.FullName + subDir2);
if (!diss.Exists) diss.Create();
lblPath.Text = diss.FullName;
lblFileName.Refresh();
lblCreated.Refresh();
lblPath.Refresh();
fi.CopyTo(diss.FullName + lFileName, true);
}
else
{
DirectoryInfo dis = new DirectoryInfo(di.FullName + "NoDateInExif\\");
if (!slaskDir)
{
if (!dis.Exists)
{
dis.Create();
set_Last_number(dis.FullName, 0);
}
else
{
slaskFilNr = get_Last_number(dis.FullName);
}
slaskDir = true;
}
slaskFilNr++;
fi.CopyTo(dis.FullName + slaskFilNr.ToString() + "_" + lFileName);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"Error msg: {ex.Message}");
}
finally
{
if (slaskFilNr > 0)
{
set_Last_number(di.FullName + "NoDateInExif\\", slaskFilNr);
}
}
lstPicFiles.Items.Clear();
Deleting = false;
lblCreated.Text = "";
lblFileName.Text = "";
lblPath.Text = "";
btnReOrganize.Enabled = false;
if (slaskFilNr > 0)
{
set_Last_number(di.FullName + "NoDateInExif\\", slaskFilNr);
}
pbReorgProcess.Visible = false;
pictureBox1.Visible = true;
}
private void txtRootDir_TextChanged(object sender, EventArgs e)
{
//Software\Tfoman\PictureReposit
RegistryKey Tfoman = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Tfoman", true);
RegistryKey PictureHandling = Tfoman.OpenSubKey(@"PictureReposit", true);
if (PictureHandling == null)
{
if (Tfoman == null)
{
Tfoman = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Tfoman");
}
else
PictureHandling = Tfoman.CreateSubKey(@"PictureReposit");
}
else
{
PictureHandling.SetValue(@"RootMap", txtRootDir.Text);
}
}
private int get_Last_number(string path)
{
int outPut = 0;
var lstNrFile = Path.Combine(path, "lastNrFile.txt");
if (File.Exists(lstNrFile))
{
outPut = int.Parse(File.ReadAllText(lstNrFile));
}
outPut++;
return outPut;
}
private void set_Last_number(string path, int lastNr)
{
var lstNrFile = Path.Combine(path, "lastNrFile.txt");
var SavedNumber = lastNr.ToString();
File.WriteAllText(lstNrFile, SavedNumber);
}
//------------------------------------------------------------------------
// Nya funktioner för hantering av original datum
//------------------------------------------------------------------------
DateTime GetOrigCreateDateTimeFromMediaFile(FileInfo file)
{
DateTime origDateTime = DateTime.MinValue;
var creationDate = getCreationDate(file);
if (creationDate != "")
{
if (file.Extension.ToLower() != ".mov")
{
creationDate = prepDateString(creationDate);
}
else
{
creationDate = prepMovDateString(creationDate);
}
origDateTime = DateTime.Parse(creationDate);
}
return origDateTime;
}
private string prepMovDateString(string creationDate)
{
var x = creationDate.Split(" ");
return $"{x[0]} {x[2]} {x[1]} {x[4]} {x[3]}";
}
private string prepDateString(string creationDate)
{
creationDate = creationDate.Replace(" ", "T");
var x = creationDate.Split("T");
x[0] = x[0].Replace(":", "-");
return x[0] + "T" + x[1];
}
private string getCreationDate(FileInfo file)
{
string output = "";
switch (file.Extension.ToLower())
{
case ".jpg":
case ".jpeg":
{
output = getExifValue("Exif IFD0", "Date/Time", file);
if (output == "")
{
output = getExifValue("Exif SubIFD", "Date/Time Original", file);
}
break;
}
case ".png":
{
break;
}
case ".mov":
{
output = getExifValue("QuickTime Movie Header", "Created", file);
break;
}
}
return output;
}
private string getExifValue(string key1, string key2, FileInfo fileInfo)
{
string output = "";
foreach (var directory in ImageMetadataReader.ReadMetadata(fileInfo.FullName))
{
if (directory.Name == key1)
{
foreach (var tag in directory.Tags)
{
if (tag.Name == key2)
{
output = tag.Description;
}
}
}
}
return output;
}
}
}