Проверить каталог окон - PullRequest
       12

Проверить каталог окон

3 голосов
/ 12 декабря 2011

Я ищу способ проверить, является ли путь допустимым каталогом Windows.

В настоящее время я являюсь этим кодом:

public static bool IsDirectory(string path) {
      return Path.IsPathRooted(path) && String.IsNullOrEmpty(Path.GetFileName(path));
}

Мне нужно улучшить его, чтобы он работал по следующим путям:

C:\foo\baa.txt\baa
\baa\x\
\baa\x
\baa

если вы видели, что это не работает на каком-то пути, пожалуйста, скажите мне. Спасибо!

Ответы [ 6 ]

3 голосов
/ 12 декабря 2011

Чтобы проверить, является ли строка допустимой строкой для пути к каталогу, Вы можете использовать Path.GetDirectoryName , чтобы проверить это. Если метод вызывает исключение или возвращает String.Empty, то это неверный путь.

Чтобы увидеть, является ли строка реальным существующим каталогом в файловой системе, вы можете использовать Directory.Exists .

1 голос
/ 13 декабря 2011

Это один из случаев, когда простой шаблон Regex является самым простым решением:

public static bool IsDirectory(string path)
{
    return Regex.IsMatch(path, 
        "([a-z]:)?\\\\[^/:*?\"<>|\\r\\n]*", 
        RegexOptions.IgnoreCase);
}
0 голосов
/ 12 декабря 2011

Правила для допустимого пути задокументированы в MSDN в статье Имена файлов, путей и пространств имен .Что является «действительным» в вашем случае, зависит от того, насколько строгим вы хотите быть.Windows NT технически поддерживает практически все, что касается пути, за исключением нескольких зарезервированных символов.

Тем не менее, подсистема Win32 NT немного менее прощаема и имеет несколько правил, которым вы должны следовать, такие как зарезервированные имена файлов CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9и т. д.

В конце дня, хотя вы не должны проверять, является ли путь действительным.Просто попробуйте открыть или иным образом работать по пути, который вам дает пользователь, и если вы не можете открыть / оперировать тем, что он дает, покажите сообщение об ошибке.На самом деле это ничем не отличается от того, что пользователь вручает вам испорченный файл и просит вас сделать из него заголовки или хвосты.

0 голосов
/ 12 декабря 2011

Много способов.

One:

public static bool IsDirectory(string path) {
  if (!String.IsNullOrEmpty(path)) {
    if (Path.DirectoryExists(path)) {
      DirectoryInfo dir = new DirectoryInfo(path);
        return ((dir.Attributes & FileAttributes.Directory) == FileAttributes.Directory);
    }
  }
  return false;
}
0 голосов
/ 12 декабря 2011
return System.Directory.Exists(path);

EDIT: Используя класс Path, вы можете проверить синтаксически допустимую строку пути (Path.GetFileName и Path.GetDirectoryName вызывают исключения, если нет). Однако вы не можете определить, соответствует ли он файлу или каталогу.

enter image description here

На рисунке показан путь, который выглядит как текстовый файл, но на самом деле является каталогом. С другой стороны, у вас может быть путь типа «C: \ abc \ xyz», который выглядит как путь к каталогу, но также может обозначать файл без расширения.

Исключениями являются корневые каталоги "C: \" и другие строки пути, заканчивающиеся обратной косой чертой. Однако путь к каталогу также синтаксически допустим, если он не заканчивается обратной косой чертой.

Вывод: в большинстве случаев вам придется проверять строку пути по отношению к реально существующему каталогу или файлу, чтобы получить определенность.

0 голосов
/ 12 декабря 2011

Используйте класс BCL Directory, у него есть метод Exists().

if (Directory.Exists(@"c:\foo\baa.txt\baa"))
{
    // etc
}

ОБНОВЛЕНИЕ : Мое первоначальное предположение состояло в том, что ОП смотрел, просматривал ли каталогсуществует, учитывая, что он хочет знать, верен ли синтаксис, вы можете использовать Path.GetDirectoryName() (как впервые указал Рид), чтобы вернуть часть пути к каталогу.

var dir = Path.GetDirectoryName(@"c:\foo\baa.txt\baa");

Который выбрасывает, если какие-либо недопустимые символы.Если вы хотите убедиться, что путь является только каталогом (не путь к файлу), вы можете сравнить путь с возвращенным каталогом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...