testfolder() -> fexist()

Здесь обсуждается всё, что касается макросов.
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

testfolder() -> fexist()

Post by Raistlin »

Предлагаю объединить функции fexist() и testfolder(), добавив в fexist() опциональный параметр type:
fexist(filepath[,type])

Список типов, например, такой:
1 (0b00000001)- файл
3 (0b00000011)- симлинк к файлу
65 (0b01000001) - папка
66 (0b01000010) - junction
67 (0b01000011) - симлинк к нефайловому объекту

Если тип не указан, возвращаем:
  • 0 - объекта с именем нет
  • тип объекта
  • -3 - нет доступа Read к объекту
  • -4 - невозможно проверить существование объекта (нет доступа к родительской папке)
  • -255 - прочие ошибки
Если тип указан, возвращаем:
  • 2 - файл ненулевой длины / непустая папка / симлинк или junction на соответствующий объект
  • 1 - файл нулевой длины / пустая папка / симлинк или junction на соответствующий объект
  • 0 - объект не существует
  • -1 - объект существует, но указывает на недоступную папку / несуществующий файл (только для симлинков/junction)
  • -2 - существует объект с таким именем, но другого типа
  • -3 - нет доступа Read к объекту
  • -4 - невозможно проверить существование объекта (нет доступа к родительской папке)
  • -255 - прочие ошибки


Будет очень удобно проверять одновременно существование, например, папки и возможность ее создания:

Code: Select all

fexist("C:\Folder")
Получили в ответ "-1" - и вопросов больше нет: папки нужной не существует и создать ее нельзя.

Новый синтаксис гибок к дальнейшим изменениям: можно добавлять новые типы объектов и ошибок.

Существующие макросы, возможно, потребуют некоторой доработки, но... за все надо платить. Подчеркну - возможно, только в том случае, если в макросе проверяется "единичность" вместо "ненулевости" и "неравность единице" вместо "нулевости" (). Но такую манеру описания условий вряд ли можно назвать хорошим тоном. Еще несовместимость может возникнуть, если код возврата функции потом с чем-нибудь складывается.
Magically yours
Raistlin
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: testfolder() -> fexist()

Post by John Doe »

Raistlin wrote:Предлагаю объединить функции fexist() и testfolder()
Можно.
Raistlin wrote:...добавив в fexist() опциональный параметр type
Не стоит.
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

Лаконично. Обоснуешь?

Список типов надо поправить, а то получается ерунда. Результат многих дум, что поделать. Сейчас подумаю еще.
Magically yours
Raistlin
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

Изменил список типов.
Magically yours
Raistlin
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

И еще раз.
Magically yours
Raistlin
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: testfolder() -> fexist()

Post by John Doe »

Raistlin wrote:Лаконично. Обоснуешь?
Слишком сложно получается.
Всё описание не просто дочитать до конца.
А если пытаться разобрать глубже, то надо ведь ещё и сравнить между собой вышеприведённые таблицы (на предмет выявления отличий).

Макроязык должен оставаться простым.
Имхо лаконичность описания наилучший критерий этого.
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

На самом деле, ничего сложного. Главная идея такова:
Если код возврата > 0 - объект существует и доступен
Если код возврата = 0 - объект не существует (но можно попробовать его создать)
Если код возврата < 0 - ничего обнадеживающего функция не сообщает

А дальше идет уже конкретизация. И не сказал бы, что это самое объемное описание из уже существующих.
Magically yours
Raistlin
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: testfolder() -> fexist()

Post by John Doe »

Предлагаю:
  • убрать работу со связями (выделить в отдельную функцию)
  • возвращать значение в виде битовых флагов (чтобы всё поместилось в 1 табличку, ну и без Type).
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

И где же здесь объединение с testfolder()? Мы так просто похерим ее функционал.
Не могу понять, чем мешает type. Кому не нравится или кто не хочет вникать, тот не пользуется.
Magically yours
Raistlin
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

Можно было ведь и так все описать:
  • 2 - файл ненулевой длины / непустая папка (или симлинк/junction на соответствующий объект)
  • 1 - файл нулевой длины / пустая папка (или симлинк/junction на соответствующий объект)
  • 0 - объект не существует
  • -1 - объект существует, но указывает на недоступную папку / несуществующий файл (только для симлинков/junction)
  • -2 - существует объект с таким именем, но другого типа
  • -3 - нет доступа Read к объекту
  • -4 - невозможно проверить существование объекта (нет доступа к родительской папке)
  • -255 - прочие ошибки
Magically yours
Raistlin
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: testfolder() -> fexist()

Post by John Doe »

Raistlin wrote:И где же здесь объединение с testfolder()?
бит 0 - существует ли объект с таким именем
бит 1 - файл/папка
бит 2 - пустой/непустой
...

Связи и их корректность при этом нас не волнуют (если надо - в отдельную функцию).

P.S.
Впрочем, если связей не будет, то уже и так всё упрощается, и (опциональный) Type не помешает.
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

testfolder() еще тестирует на пустоту и доступность - это раз. И связи не волнуют не всех - это два.
Поправил описание. Теперь все лаконичнее и нагляднее.

Прощу прощения, не сразу вник в биты. Но, тем не менее, мой вариант дает больше возможностей.
Magically yours
Raistlin
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: testfolder() -> fexist()

Post by John Doe »

Raistlin wrote:Теперь все лаконичнее и нагляднее.
В переработанном варианте пойдёт, свои замечания снимаю.
Единственное: такой выбор констант для типов мне не кажется сколько-нибудь оправданным.

Проще без хитростей:
0 - любой
1 - файл
2 - папка
3 - симлинк к файлу
4 - симлинк к нефайловому объекту
5 - junction
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Re: testfolder() -> fexist()

Post by John Doe »

Не хватает возможности получить тип объекта с заданным именем.
Для этого можно было бы использовать константу -1.

P.S
User avatar
Raistlin
Posts: 750
Joined: Wed 16 Mar, 2005 16:01
Has thanked: 3 times
Been thanked: 1 time

Re: testfolder() -> fexist()

Post by Raistlin »

Можно и битами без жертвования связями:
бит 0 - существует ли объект с таким именем
бит 1 - файловый объект/нефайловый объект
бит 2 - "самостоятельный" (файл, папка) / "несамостоятельный" (симлинк, junction)
бит 3 - пустой или нулевой длины /непустой или ненулевой длины
бит 4 - доступен для Read / недоступен для Read
бит 5 - родительский объект доступен / родительский объект недоступен
бит 6 - target существует / target не существует
бит 7 - если 1, то произошла некая иная ошибка

Но, во-первых, становятся неразличимы junction и симлинк к папке, а во-вторых, голову сломаешь биты складывать. Или существует какой-то доступный и наглядный способ сравнения битов?
Проще без хитростей:
1 - файл
2 - папка
3 - симлинк к файлу
4 - симлинк к нефайловому объекту
5 - junction
Проще. Но файл и симлинк к файлу - это для большинства операций, в общем-то, одни и те же яйца с разных ракурсов. То же для папок с junctions и симлинками. А вдруг еще чего придумают - как их потом группировать при анализе кода возврата? Поэтому использование битов здесь оправдано.
Не хватает возможности получить тип объекта с заданным именем.
Как так? Если type опустить, как раз тип и возвратится.
И ещё как-то выяснить бы наличие прав на чтение/запись в эти файлы/папки...
Это да, и сам на эту мысль наткнулся. Вернее, чтение-то как раз проверяем (см. код возврата -3), а вот с записью и прочим такой комбайн выйдет - не приведи Господь.
А что, не планируется ли сделать функцию для вызова WinAPI-функций? Разом бы куча проблем снялась.
Magically yours
Raistlin
Post Reply

Return to “Обсуждение макросов”