Dělám aplikaci, kde uživatel zadává cestu k jednomu nebo více souborům a současně může v názvu použít * jako wildcard character. Potřeboval jsem nějakým způsobem validovat, že uživatel zadává smysluplný řetězec ve formátu „C:\cesta\k\souboru.txt;C:\jina\cesta\s*maskou.txt“. Jak na to?
.NET žádné extra metody na validaci cest nemá. File.Exists() vrátí false nejen při neplatné cestě, ale i tehdy, když je cesta syntakticky zcela v pořádku, jen neexistuje cílový soubor. Tudy proto cesta nevede.
Pro validaci jednoho souboru lze úspěšně použít malou fintu využívající mechanismus výjimek:
try {
validPath = Path.GetFullPath(pathToValidate);
}
catch (Exception) {
// path is not valid
// you can catch many different exceptions - see
// MSDN documentation to GetFullPath() method
}
Pro dříve uvedené zadání však .NET žádnou jednoduchou metodu nenabízí. Nejlepším řešením je proto regulární výraz:
^([a-zA-Z]:\\([^\\/:\*\?"<>\|]+\\)*[^\\/:\?"<>\|]+;?)+$
Po úvodním „C:\“ se může několikrát opakovat „část_cesty\“ (povoleny jsou všechny znaky kromě \ / : * ? " < > |) a celý vzor nakonec končí „jménem*souboru.txt“ (hvězdička je tentokár povolena). Celý tento vzor se může opakovat i víckrát, přičemž jednotlivé instance jsou odděleny středníkem.
Pro jednoduchou validaci by to mělo stačit, kdo touží po opravdu hardcore regulárním výrazu, může použít chuťovku z RegExLib.com.
před 5 let 46 týdnů
před 5 let 46 týdnů
před 6 let 16 týdnů
před 6 let 30 týdnů
před 6 let 43 týdny
před 6 let 52 týdny
před 7 let 1 týden
před 7 let 4 týdny
před 7 let 10 týdnů
před 7 let 19 týdnů