# Spring.NET miscellanea

## Introduction

This chapter contains miscellanea information on features, goodies, caveats that does not belong to any paricular area.

## PathMatcher

`Spring.Util.PathMatcher` provides `Ant/NAnt`-like path name matching features.

To do the match, you use the method:

    static bool Match(string pattern, string path)

If you want to decide if case is important or not use the method:

    static bool Match(string pattern, string path, bool ignoreCase)

### General rules

To build your pattern, you use the `*`, `?` and `**` building blocks:

- `*`: matches any number of non slash characters;

- `?`: matches exactly 1 (one) non slash/dot character;

- `**`: matches any subdirectory, without taking care of the depth;

### Matching filenames

A file name can be matched using the following notation:

    foo?bar.*

matches:

    fooAbar.txt
    foo1bar.txt
    foo_bar.txt
    foo-bar.txt

does not match:

    foo.bar.txt
    foo/bar.txt
    foo\bar.txt

The classical all files pattern:

    *.*

matches:

    foo.db
    .db
    foo
    foo.bar.db
    foo.db.db
    db.db.db

does not match:

    c:/
    c:/foo.db
    c:/foo
    c:/.db
    c:/foo.foo.db
    //server/foo

### Matching subdirectories

A directory name can be matched at any depth level using the following notation:

    **/db/**

That pattern matches the following paths:

    /db
    //server/db
    c:/db
    c:/spring/app/db/foo.db
    //Program Files/App/spaced dir/db/foo.db
    /home/spring/spaced dir/db/v1/foo.db

but does not match these:

    c:/spring/app/db-v1/foo.db
    /home/spring/spaced dir/db-v1/foo.db

You can compose subdirectories to match like this:

    **/bin/**/tmp/**

That pattern matches the following paths:

    c:/spring/foo/bin/bar/tmp/a
    c:/spring/foo/bin/tmp/a/b.c

but does not match these:

    c:/spring/foo/bin/bar/temp/a
    c:/tmp/foo/bin/bar/a/b.c

You can use more advanced patterns:

    **/.spring-assemblies*/**

matches:

    c:/.spring-assemblies
    c:/.spring-assembliesabcd73xs
    c:/app/.spring-assembliesabcd73xs
    c:/app/.spring-assembliesabcd73xs/foo.dll
    //server/app/.spring-assembliesabcd73xs

does not match:

    c:/app/.spring-assemblie

### Case does matter, slashes don't

.NET is expected to be a cross-platform development ... platform. So, `PathMatcher` will match taking care of the case of the pattern and the case of the path. For example:

    **/db/**/*.DB

matches:

    c:/spring/service/deploy/app/db/foo.DB

but does not match:

    c:/spring/service/deploy/app/DB/foo.DB
    c:spring/service/deploy/app/spaced dir/DB/foo.DB
    //server/share/service/deploy/app/DB/backup/foo.db

If you do not matter about case, you should explicitly tell the `Pathmatcher`.

Back and forward slashes, in the very same cross-platform spirit, are not important:

    spring/foo.bar

matches all the following paths:

    c:\spring\foo.bar
    c:/spring\foo.bar
    c:/spring/foo.bar
    /spring/foo.bar
    \spring\foo.bar