开发者

How to move folders maintaining folder structure in c#

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);
                }
            }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜