Довольно простой способ сделать это - использовать класс 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");