Как создать папку внутри каждого каталога и подкаталоги, которые содержат файл JPG? - PullRequest
0 голосов
/ 17 мая 2019

Мне нужно иметь возможность создать папку в каждом отдельном каталоге и подкаталоге основного пути,

Но я не знаю, как получить каждый путь, содержащий файл, чтобы я мог создать там папку ... На самом деле я получаю все каталоги, которые делают это:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ImageMagick;
    using System.Collections;

    namespace ImgOptimization
    {
        class Program
        {
            static void Main(string[] args)
            {


                string path = "mypath";



                if (System.IO.Directory.Exists(path))
                {

                    string[] subdirectorios = System.IO.Directory.GetFiles(path, "*.jpg", SearchOption.AllDirectories);

                    string carpetas = null;



                    for (int i = 0; i < subdirectorios.Length; i++)
                    {

                        carpetas = subdirectorios[i];


                            string newpathMobile = "newpath"


                            if (!System.IO.Directory.Exists(newpath))
                            {
                                System.IO.Directory.CreateDirectory(newpath);
                            }

                    }
                }
}
}

Но я не знаю, как создать папку для каждого отдельного пути во время цикла, есть идеи, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Довольно простой способ сделать это - использовать класс DirectoryInfo, который возвращает строго типизированные объекты DirectoryInfo (в отличие от просто строки, представляющей путь к каталогу).

Мыможно отфильтровать результаты по тем, в которых каталог содержит файл с указанным нами расширением, а затем мы можем добавить подкаталог в этот каталог:

public static void CreateDirectoryNextToFileType(string rootPath, string fileExtension, 
    string newDirectoryName)
{
    if (rootPath == null || !Directory.Exists(rootPath))
        throw new ArgumentException("rootPath must be the path to an existing directory");

    if (fileExtension == null) throw new ArgumentNullException(nameof(fileExtension));

    if (string.IsNullOrEmpty(subDirectoryName) ||
        subDirectoryName.Any(chr => Path.GetInvalidPathChars().Contains(chr)))
        throw new ArgumentException("subDirectoryName is null, empty, or " + 
            "contains invalid characters");

    // Enumerate all directories and return those that 
    // contain a file with the specified extension
    var directoriesContainingFile = new DirectoryInfo(rootPath)
        .EnumerateDirectories("*", SearchOption.AllDirectories)
        .Where(dir => dir.EnumerateFiles().Any(file =>
            file.Extension.Equals(fileExtension, StringComparison.OrdinalIgnoreCase)));

    // For each of the directories, create a sub directory with the specified name
    foreach (var directory in directoriesContainingFile)
    {
        directory.CreateSubdirectory(newDirectoryName);
    }
}

Так что, если мы хотим создать подкаталог с именем "NewDirNextToCmdFile" внутри любого каталога, содержащего файл ".cmd" в любом месте под корнем "f:\private\temp", мы бы назвали этот метод следующим образом:

CreateDirectoryNextToFileType(@"f:\private\temp", ".cmd", "NewDirNextToCmdFile");
0 голосов
/ 17 мая 2019

Вы можете проходить все подкаталоги рекурсивно, как это

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace TestSubDirectories
{
    class Program
    {

        static string NewFolderName = "NewFolder";
        static void Main(string[] args)
        {

            string path = "C:\\testfolder";

            if (Directory.Exists(path))
                CreateSubFolderIn(path);
        }


        static void CreateSubFolderIn(string path)
        {
            foreach (string SubDirectory in Directory.GetDirectories(path))
            {
                CreateSubFolderIn(SubDirectory);
            }

            if(!Directory.Exists(path + "\\" + NewFolderName))
                Directory.CreateDirectory(path + "\\" + NewFolderName);

        }

    }
}
...