Консультация № 140116
17.07.2008, 11:07
0.00 руб.
0 24 0
Здравствуйте эксперты !

Подскажите пжлста почему приведенный ниже кусок кода не создает папку скрытую. И как создавать скрытую?
Заранее спасибо.
С++Билдер6

Приложение:
if (!DirectoryExists("MyFolder")) { CreateDir("MyFolder"); FileSetAttr("MyFolder", faDirectory | faReadOnly | faSysFile | faHidden | faArchive); };

Обсуждение

давно
Посетитель
7438
7205
17.07.2008, 17:02
общий
Странно, у меня создает...
Создается папка и устанавливаютя атрибуты, все как положено...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.07.2008, 17:06
общий
А может, в свойствах папки включено отображение "защищенных системных файлов"?
Эти атрибуты дают весьма условную скрытность.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
18.07.2008, 08:03
общий
Нет, отображение "защищенных системных файлов" выключено. Причем ручками через explorer атрибуты устанавливаются, и папка действительно скрывается
давно
Посетитель
7438
7205
18.07.2008, 10:24
общий
Тогда вопрос: Что возвращает функция FileSetAttr ?
Если она отрабатывает, то возвращает ноль, иначе - код ошибки.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
18.07.2008, 10:54
общий
Возвращает 0
давно
Мастер-Эксперт
425
4118
18.07.2008, 11:36
общий
Муратов Радик Анатольевич

Так Вам нужно создать скрытую папку или скрыть уже существующую?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
18.07.2008, 11:49
общий
Тут как раз понятно: Сначала создается, потом меняются атрибуты у только что созданной...
Непонятно другое: У меня прекрасно все работает!
Еще одно предложение - попробуйте изменить только часть атрибутов, например так:
FileSetAttr("MyFolder", faReadOnly | faHidden | faArchive);
Или вообще только что-то одно. И проверить результат.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
18.07.2008, 11:58
общий
Для sir henry: создать скрытую
давно
Мастер-Эксперт
425
4118
18.07.2008, 12:07
общий
Я ведь не зря об этом спросил. :)
Если внимательно посмотреть на код, то можно увидеть, что когда данная папка уже существует, то код не отрабатывает.
Других причин я не вижу.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
18.07.2008, 12:10
общий
Муратов Радик Анатольевич

Попробуйте изменить код следующим образом:

if (!DirectoryExists("MyFolder"))
CreateDir("MyFolder");

FileSetAttr("MyFolder", faHidden);

Уверен, всё заработает самым великолепным образом. ;)
И Игорь Витальевич совершенно прав - чтобы скрыть папку одного аттрибута faHidden совершенно достаточно.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
18.07.2008, 12:19
общий
2 sir henry:
Раз автор говорит, что функция возвращает 0, значит, все-таки, перед повторным запуском удаляет созданную папку...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
18.07.2008, 12:40
общий
Лысков Игорь Витальевич

Это всего лишь предположение.
Хорошо, а какие ещё могут быть предположения?
Я бы предложил сделать вот что:

ShowMessage(IntToStr(FileSetAttr("MyFolder", faHidden)));

чтобы убедиться...
И в любом случае, FileSetAttr() лучше вынести за скобки, т.к. к созданиюсуществованию папки эта функция не имеет никакого отношения.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
7438
7205
18.07.2008, 12:58
общий
2 sir henry:
Да, конечно, "за скобки" будет корректнее.
Ждем комментариев автора...Ау!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
18.07.2008, 13:18
общий
Хм, после получения вопроса я вначале заглянул в MSDN и посмотрел на родственную ф-ю SetFileAttributes
Так вот, в комментариях там записано:

The following table describes how to set the attributes that cannot be set using SetFileAttributes..
(Следующая таблица описывает, какие атрибуты не могут быть установлены при помощи SetFileAttributes)
Оставил только интересующие нас

FILE_ATTRIBUTE_DIRECTORY Files cannot be converted into directories. To create a directory, use the CreateDirectory or CreateDirectoryEx function.
(файл не может быть сконвертирован в директорию. Для создания директории используйте...)
FILE_ATTRIBUTE_SYSTEM This attribute cannot be set.
(Этот атрибут не может быть установлен)
Сначала подумал: О! вот оно. А потом попробывал в Builder-е, и убедился, что все-равно работает!...
Это так, информация к размышлению, может быть в других версиях (SP) это было подправлено...
У меня простая XP без всяких SP...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Мастер-Эксперт
425
4118
18.07.2008, 13:35
общий
Лысков Игорь Витальевич

У меня XP SP3. Установка всех аттрибутов сразу тоже не вызывает проблем, хотя вот faDirectory мне отчего-то не кажеться такой уж остро необходимой в данном случае. Да и в любом случае, эти аттрибуты просто не отработают вместе этой функцией, но ошибку не вызовут.
Посмотрел сейчас тоже MSDN, там у меня никаких предупреждений по поводу FILE_ATTRIBUTE_SYSTEM нет. Да и если так посмотреть, если я, в FAR'е например, могу поставить аттрибут файла "системным", то отчего ж не сделать и с помощью этой функции такого же...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
18.07.2008, 14:17
общий
пробовал на нескольких компьютерах, на некоторых работает, не некоторых нет :(
давно
Посетитель
7438
7205
18.07.2008, 14:32
общий
2 sir henry:
Посмотрел в более поздней версии MSDN, там, действительно, FILE_ATTRIBUTE_SYSTEM нет. И это правильно! Все встало на свои места.
2 Муратов Радик Анатольевич:
Вы пробывали устанавливать атрибуты по одному? Каков результат?
Хм. А вот вопрос...Может не хватает прав пользователя для изменения атрибутов? Уж не знаю, что уже и думать...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
18.07.2008, 15:21
общий
Права админа у меня, по одному еще не прбовал, сейчас попробую
давно
Мастер-Эксперт
425
4118
18.07.2008, 18:33
общий
Лысков Игорь Витальевич

"Может не хватает прав пользователя для изменения атрибутов?"
Нет, если папка создаётся тут же, то и все права у создателя будут.

Муратов Радик Анатольевич

А какая операционная система?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
28.07.2008, 15:44
общий
система XP sp2
давно
Мастер-Эксперт
425
4118
28.07.2008, 17:31
общий
Какая файловая система на диске, где создаётся папка?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
30.07.2008, 13:33
общий
система FAT32
давно
Мастер-Эксперт
425
4118
30.07.2008, 14:36
общий
Муратов Радик Анатольевич

"система FAT32"
"пробовал на нескольких компьютерах, на некоторых работает, не некоторых нет"
Вот из тех компьютеров, на которых код тоже не работает, все с FAT32 или нет?
Просто была у меня аналогичная проблема - не было доступа к файлу именно в системе с FAT32, хотя там у файловой системы в принципе нет никаких аттрибутов безопасности. Переконвертировал в NTFS, раздал правильные права доступа и всё заработало как часы.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
31.07.2008, 11:35
общий
к сожалению, смогу проаерить еще раз только в понедельник, так как сейчас в отпуске
Форма ответа