Есть ли опция расширения подстановочных знаков для приложений .net?

Я использовал ссылку setargv.obj для расширения аргументов подстановок в прошлом для ряда приложений на C и С++, но я могу Не находите подобных упоминаний для приложений .net.

Есть ли способ standard для автоматического расширения шаблона командной строки приложения? (т.е. развернуть *.doc из одной записи параметра args во все, что соответствует этому групповой символ).

P.S. Я взломал что-то вместе с Directory.GetFiles() для моего текущего небольшого проекта, но он не охватывает подстановочные знаки с путями (пока), и было бы неплохо сделать это без специального кода.

Обновление: вот мой грубый взлом, для иллюстрации. Он должен разделить параметры для пути и имени для GetFiles, но это общая идея. Связывание setargv.obj в приложении C или С++ будет в основном делать все расширение подстановки, оставляя пользователя только перебирать массив argv.


static void Main(string[] args)
{
    foreach (String argString in args)
    {
        // Split into path and wildcard
        int lastBackslashPos = argString.LastIndexOf('\\') + 1;
        path = argString.Substring(0, lastBackslashPos);
        filenameOnly = argString.Substring(lastBackslashPos, 
                                   argString.Length - lastBackslashPos);

        String[] fileList = System.IO.Directory.GetFiles(path, filenameOnly);
        foreach (String fileName in fileList)
        {
            //do things for each file
        }
    }
}

Ответ 1

Ваш код выглядит точно так, как вы должны это делать.

Ответ 2

Вот мой грубый взлом. Я бы хотел, чтобы он был рекурсивным. И, столкнувшись с недостатками подстановочных знаков Windows, я мог бы решить использовать регулярные выражения, а не позволить GetFiles() сделать это для меня.

using System.IO;

public static string[] ExpandFilePaths(string[] args)
{
    var fileList = new List<string>();

    foreach (var arg in args)
    {
        var substitutedArg = System.Environment.ExpandEnvironmentVariables(arg);

        var dirPart = Path.GetDirectoryName(substitutedArg);
        if (dirPart.Length == 0)
            dirPart = ".";

        var filePart = Path.GetFileName(substitutedArg);

        foreach (var filepath in Directory.GetFiles(dirPart, filePart))
            fileList.Add(filepath);
    }

    return fileList.ToArray();
}

Ответ 3

Я точно не знаю, что вы после... но если я пойду туда, где вы собираетесь с "Hack" Directory.GetFiles(), вы упомянули, то что-то вроде этого может работать:

var Dirs = Directory.GetDirectories(@"C:\Windows", "sys*", 
SearchOption.TopDirectoryOnly).ToList();
var Files = new List<String>();
Dirs.ForEach(dirName => Files.AddRange(Directory.GetFiles(dirName, "*.sys", SearchOption.AllDirectories)));

Параметр подстановки в вызове GetDirectories позволит вам захватить все каталоги, содержащиеся в папке Windows [непосредственно], которые соответствуют шаблону "sys *".

Затем вы можете перебирать эти папки, захватывая все файлы, соответствующие шаблону "*.sys".

Это то, что вы ищете? Чтобы автоматически расширять аргументы, вам нужно будет извлечь подстановочные знаки каким-либо значимым образом и применить их к этой модели...

Например:

RunMyApp "C:\Windows\Sys *\*.sys"

Вы вытащите строку C:\Windows - возможно, с регулярным выражением, найдите каталог нижнего уровня, который не содержит подстановочный знак, и примените его к методу GetDirectories, добавив подстановочную строку в качестве параметра поиска.

Затем, если ваш конец строки (в данном случае *.sys) в качестве шаблона поиска для Directory.GetFiles.

Если вы хотите усложниться и сделать что-то вроде:

C:\Windows\*\Sys*\*.sys

Вы должны использовать SearchOptions для установки этого поведения:

Directory.GetDirectories(@"C:\Windows", "sys*", SearchOptions.AllDirectories)

Это позволит захватить все каталоги, которые соответствуют шаблону sys * в каталоге Windows и во всех каталогах под ним.

Если вы хотите получить гораздо более сложную, чем это, тогда я не уверен, как вы это сделаете... например, скажите, что вам нужны папки, которые содержатся в папках непосредственно в каталоге Windows - я понятия не имею как бы вы хотели что-то вроде этого, я боюсь... Я не думаю, что экспортировать всю структуру дерева в XML и использовать XPath для этого было бы так эффективно - XPath был бы невероятно простым для разбора с использованием подстановочных знаков - но преобразование в XML не было бы настолько эффективным...

Ответ 4

см. исходный код дизассемблированного класса Microsoft.Build.Shared.FileMatcher в Microsoft.Build.dll вы можете получить некоторую идею из реализации метода GetFiles.

в качестве клиента вы можете использовать метод следующим образом

var filelist = FileMatcher.GetFiles(@"c:\alaki",@"c:\alaki\**\bin\*.dll");