I am writing a C# application that scans through a directory of .jpg images. It then updates the Exif meta information for the images. Once this has been completed it saves the new images to a location maintaining the same folder structure as where it got the images.
Everything works fine to this point until I try and save the images maintaining the same folder folder as where I got the images from.
What is happening is that the images are being saved to a single folder instead of multiple folders.
The folder structure where I get the images looks like this:
1997 -> JAN-JUN 1997 -> APRIL 1997 -> 7.4.97 - 11.4.97 -> FRI 11.4.97
Below is a copy of the code that handles the task.
/// <summary>
/// Search the directories
/// </summary>
/// <param name="sDir">Pass in the directory to be searched</param>
void DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, txtfile.Text))
{
if (progressBar1.Value < progressBar1.Maximum)
{
// Return the folder name - only the data part e.g 7.9.1997
string folderName = new FileInfo(f).Directory.Name;
string[] parts = folderName.Split(' ');
string lastPart = parts[parts.Length - 1];
// minimally loads image and closes it
ExifPropertyCollection properties = ExifReader.GetExifData(f.ToString());
int lastDot = imagePath.LastIndexOf('.');
string inputPath = f.ToString();
string outputPath = destinationDir + getFileNameFromPathString(f.ToString()) + ".jpg";
// add copyright tag
ExifProperty copyright = new ExifProperty();
copyright.Tag = ExifTag.Copyright;
copyright.Value = String.Format(
"Copyright (c){0} Shepparton News. All rights reserved.",
DateTime.Now.Year);
// Add folder date to exif tag
ExifProperty folderDate = new ExifProperty();
folderDate.Tag = ExifTag.DateTime;
folderDate.Value = lastPart.ToString();
ExifWriter.AddExifData(inputPath, outputPath, copyright, 开发者_C百科folderDate);
ListViewItem item = lstFilesFound.Items.Add(getFileNameFromPathString(f.ToString()));
item.SubItems.Add(lastPart.ToString());
item.SubItems.Add(f.ToString());
progressBar1.PerformStep();
}
}
DirSearch(d);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Could anyone please point me in the right direction or offer an example on how to achieve this task. Any help greatly appreciated. Thanks.
Here are some of the helper methods:
/// <summary>
/// Return the name of a file
/// </summary>
/// <param name="filePathString">The filepathstring to search</param>
public static string getFileNameFromPathString(string filePathString)
{
filePathString = filePathString.Replace("\\", "/");
string[] pathParts = Regex.Split(filePathString, "/");
return pathParts[pathParts.Length - 1];
}
Image save method:
public static void AddExifData(string inputPath, string outputPath, params ExifProperty[] properties)
{
using (Image image = Image.FromFile(inputPath))
{
ExifWriter.AddExifData(image, new ExifPropertyCollection(properties));
image.Save(outputPath);
}
}
Here is the new method I am trying to use, however it gives me the error "The best overloaded method match for 'System.Image.Drawing.Image.Save(string)' has some invalid arguments.
public static void AddExifData(string inputPath, DirectoryInfo outputPath, params ExifProperty[] properties)
{
if (!outputPath.Exists)
{
outputPath.Create();
}
using (Image image = Image.FromFile(inputPath))
{
ExifWriter.AddExifData(image, new ExifPropertyCollection(properties));
image.Save(outputPath);
}
}
New AddExifData method
public static void AddExifData(string inputPath, string outputPath, params ExifProperty[] properties)
{
if (!Directory.Exist(outputPath)) { Directory.Create(outputPath); }
using (Image image = Image.FromFile(inputPath))
{
ExifWriter.AddExifData(image, new ExifPropertyCollection(properties));
image.Save(outputPath.ToString(), ImageFormat.Jpeg);
}
}
This above new method gives me these errors. System.IO.Directory does not contain a definition for 'Exist' System.IO.Directory does not contain a definition for 'Create'
Finally:
void DirSearch(string sDir, string relativeDir)
{
foreach (string f in Directory.GetFiles(sDir,txtfile.Text))
{
//doing something...
string outputPath = destinationDir + relativeDir + getFileNameFromPathString(f.ToString()) + ".jpg";
//doing more...
}
foreach (string d in Directory.GetDirectories(sDir))
{
int lst = d.LastIndexOf("\\") + 1;
string newRelative = relativeDir + d.Substring(lst, d.Length - lst) + "\\";
//relativeDir = relativeDir + d.Substring(lst, d.Length - lst) + "\\";
DirSearch(d, newRelative);
}
}
精彩评论