Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить есть ли у программы доступ в каталог ? [D6, Win2k, WinXP]


dreamse ©   (2005-11-04 10:47:00) 

Т.е вопрос про разграничение доступа к каталогам, мне нужно определить имеет ли программа полный доступ к определёному каталогу. Хотелось бы решить эту проблему не дибильным Try Except

Есть ли решение ?


Чапаев   (2005-11-04 12:57:00) [1]


> Тем что в программе несколько тыс строк и каждый блок помещать
> в Try Except выглядит несколько не разумным

А что, нельзя выделить все проверки в функцию?


Джо   (2005-11-04 11:37:00) [2]


>  [8] dreamse   (04.11.05 11:32)
> Нужно определить доступ в локальный каталог

Я и написал что

> создатель каталога сменил права доступа

Кроме того, даже если есть права на просмотр содержимого каталога, то на файлы, находящиеся в нем, могут быть установлены совсем другие права для разных действий. Т.е, на каждый файл - разные права. Чем тогда поможет функция определения "доступности" каталога? Ничем. Все равно, как и обычно, придется обрабатывать ошибки работы с каждым файлом. И это есть правильно.
И, кроме неимения прав доступа может быть еще с десяток причин, по которым в доступе может быть отказано.
Если уж так хочется, то в качестве очень грубого и не слишком полезного приближения можно написать такую вот функцию:

function TryPath (APath: string; var ErrorCode: Cardinal): Boolean;
var
 H: THandle;
begin
 ErrorCode := 0;
 H := CreateFile(PChar(APath),
   GENERIC_READ,
   FILE_SHARE_READ,
   nil,
   OPEN_EXISTING,
   FILE_FLAG_BACKUP_SEMANTICS,
   0);
 if H <> INVALID_HANDLE_VALUE then
 begin
   Result := True;
   CloseHandle(H);
 end
 else
 begin
   ErrorCode := GetLastError;
   Result := False;
 end
end;

(Писал не в редакторе, поэтому возможны ошибки).
Но, повторю еще раз: я не считаю такой подход верным. По крайней мере, в общем случае.


dreamse   (2005-11-04 11:32:00) [3]

> Джо ©   (04.11.05 11:21) [7]

Нужно определить доступ в локальный каталог


Джо   (2005-11-04 11:21:00) [4]


> [2] dreamse   (04.11.05 10:53)
> Т.е в начале запустить функцию проверки и всё , типа :


Ничего не всё. Вообще-то, В ЛЮБОМ случае нужно обрабатывать ошибки работы с файлами/каталогами. Предположим, что ты определил, что доступ к каталогу у тебя есть, но, как только ты попытался читать из него, создатель каталога сменил права доступа или выдернул сетевой шнур.


umbra   (2005-11-04 11:15:00) [5]

dreamse   (04.11.05 11:04) [4]

Ну, она не совсем сторонняя, входит в комплект винды. И с помощью CreateProcessв Делфи можно получить текст, который cacls выдает на стандартный вывод.


Плохиш   (2005-11-04 11:10:00) [6]

www.msdn.com знает всё про внутренне и не только устройство вындовс.

PS. И русский бы подучить не мешало.


dreamse   (2005-11-04 11:04:00) [7]

Интересует определение доступа с помощью Delphi без всяких стороних утилит


umbra   (2005-11-04 11:01:00) [8]

апи я не знаю, но существует утилита cacls, которая выдает список существующих прав доступа к файлу/папке или строку "Access is denied"


dreamse   (2005-11-04 10:53:00) [9]

> Чапаев ©   (04.11.05 10:49) [1]

1) Тем что в программе несколько тыс строк и каждый блок помещать в Try Except выглядит несколько не разумным

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

Т.е в начале запустить функцию проверки и всё , типа :

if not folderacess(Path+'data') then showmessage('error aces : data');
if not folderacess(Path+'Help') then showmessage('error aces : Help');

и т.д


Чапаев   (2005-11-04 10:49:00) [10]


> Хотелось бы решить эту проблему не дибильным Try Except

А чем не нравится этот способ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо