Имена файлов, соответствующие «.. \ ThirdParty \ dlls \ *. Dll» - PullRequest
1 голос
/ 01 октября 2011

Есть ли простой способ получить список имен файлов, которые сопоставляют шаблон имени файла , включая ссылки на родительский каталог ?Я хочу, чтобы "..\ThirdParty\dlls\*.dll" возвратил коллекцию наподобие ["..\ThirdParty\dlls\one.dll", "..\ThirdParty\dlls\two.dll", ...]

. Я могу найти несколько вопросов, касающихся совпадения имен файлов, включая полный путь, символы подстановки, но ничего, что не включает в себя «.. \» в шаблоне.Directory.GetFiles явно запрещает это.

Что я хочу сделать с именами, так это включить их в zip-архив , поэтому, если есть zip-библиотека, которая может понимать относительные пути, подобные этому, я буду счастлив использовать это.

Шаблоны исходят из входного файла, они не известны во время компиляции.Они могут быть довольно сложными, например, ..\src\..\ThirdParty\win32\*.dll, поэтому анализ, вероятно, невозможен.

Наличие его в формате zip также является причиной того, что я не очень заинтересован в преобразовании шаблона в fullpath, я хочу хотеть относительные пути в zip.

РЕДАКТИРОВАТЬ: Что я действительно ищу, так это эквивалент C # /bin/ls.

Ответы [ 3 ]

3 голосов
/ 01 октября 2011
static string[] FindFiles(string path)
{
    string directory = Path.GetDirectoryName(path); // seperate directory i.e. ..\ThirdParty\dlls
    string filePattern = Path.GetFileName(path); // seperate file pattern i.e. *.dll

    // if path only contains pattern then use current directory
    if (String.IsNullOrEmpty(directory))
        directory = Directory.GetCurrentDirectory();

    //uncomment the following line if you need absolute paths
    //directory = Path.GetFullPath(directory); 

    if (!Directory.Exists(directory))      
        return new string[0];

    var files = Directory.GetFiles(directory, filePattern); 
    return files;
}
3 голосов
/ 01 октября 2011

Существует функция Path.GetFullPath (), которая преобразует относительную в абсолютную.Вы можете использовать его в части пути.

string pattern = @"..\src\..\ThirdParty\win32\*.dll";

string relativeDir = Path.GetDirectoryName(pattern);
string absoluteDir = Path.GetFullPath(relativeDir);
string filePattern = Path.GetFileName(pattern);

foreach (string file in Directory.GetFiles(absoluteDir, filePattern))
{

}
2 голосов
/ 01 октября 2011

Если я вас правильно понимаю, вы можете использовать Directory.EnumerateFiles в сочетании с таким регулярным выражением (хотя я не проверял его):

var matcher = new Regex(@"^\.\.\\ThirdParty\\dlls\\[^\\]+.dll$");
foreach (var file in Directory.EnumerateFiles("..", "*.dll", SearchOption.AllDirectories)
{
    if (matcher.IsMatch(file))
        yield return file;
}
...