.NET: более простой способ проверить каталог, чем битовые маски? - PullRequest
1 голос
/ 17 сентября 2009

Есть ли более простой способ проверить, является ли элемент файловой системы каталогом, чем использовать битовые маски?

У меня есть этот код в одном из моих приложений (две вторые строки фактически находятся в цикле по folderItems, но для простоты предположим, что первый элемент):

Dim folderItems As String() = Directory.GetFileSystemEntries(aFolder)
Dim someDirItem As String = folderItems(0)
Dim fInfo As System.IO.FileInfo = New System.IO.FileInfo(someDirItem)
Dim isDirectory As Boolean = (CInt(fInfo.Attributes) And CInt(FileAttributes.Directory)) > 0

(FileAttributes.Directory равно 16).

Это работает, но есть ли более простой способ, чем использование побитового И с 1000 (основание 2)?

Ответы [ 6 ]

11 голосов
/ 17 сентября 2009

Как насчет:

System.IO.Directory.Exists(fullPath)

Возвращает true, если fullPath является каталогом.

3 голосов
/ 17 сентября 2009

Вы могли бы использовать Directory.Exists(path) не так ли?

Dan

2 голосов
/ 17 сентября 2009

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

public static bool Has<T>(this System.Enum type, T value)
{
    try
    {
        return (((int)(object)type & (int)(object)value) == (int)(object)value);
    }
    catch
    {
        return false;
    }
}

Тогда вы просто позвоните:

Bool isDirectory = fInfo.Attributes.Has(FileAttributes.Directory))

Извините, это C #, но конвертировать его не должно быть сложно, я просто не знаю мой синтаксис VB для обобщений. Любой, кто делает, не стесняйтесь редактировать и добавлять перевод VB.

1 голос
/ 17 сентября 2009

Вам не нужно использовать CInt при выполнении сравнения:

Dim isDirectory As Boolean = _
    (fInfo.Attributes And FileAttributes.Directory) = FileAttributes.Directory
1 голос
/ 17 сентября 2009
Dim folderItems As String() = Directory.GetFileSystemEntries(aFolder)
Dim someDirItem As String = folderItems(0)
Dim isDirectory As Boolean = System.IO.Directory.Exist(someDirItem)
0 голосов
/ 17 сентября 2009

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

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