powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindFirst 5 - AccessDenied почему?
6 сообщений из 6, страница 1 из 1
FindFirst 5 - AccessDenied почему?
    #39985430
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

Подскажите, почему FindFirst выдает код 5 - Access Denied при прочтении:
C:\Users\academ\Documents\Мои видеозаписи\*.*
(с повышенными правами запускать тоже пробовал, не помогает)
хотя в Far Manager я прекрасно захожу в каталог "C:\Users\academ\Documents\Мои видеозаписи" с обычными правами.

P.S. каталог "C:\Users\academ\Documents\Мои видеозаписи" - это необычный каталог, это связь (симв.ссылка на папку)
Может в этом вся проблема и папки нужно прочитывать как-то иначе, а не просто FindFirst ?

Заранее благодарен.
...
Рейтинг: 0 / 0
FindFirst 5 - AccessDenied почему?
    #39985435
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52,

Это не символьная ссылка, это точка соединения. Читать нужно по-другому: http://codeverge.com/embarcadero.delphi.win32/using-findfirst-findnext-to-recurse/1055198
...
Рейтинг: 0 / 0
FindFirst 5 - AccessDenied почему?
    #39985803
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну все равно непонятно, как имея путь вида
"C:\Users\academ\Documents\Мои видеозаписи"
"C:\Users\academ\Documents\мои рисунки"
"C:\Users\academ\Documents\Моя музыка"
понять, что это не просто папка, а точка соединения и прочитать ее листинг (список файлов и папок в ней)

Просто FindFirst("C:\Users\academ\Documents\Мои видеозаписи\*.*") не получится, т.к. будет 5-AccessDenied.
...
Рейтинг: 0 / 0
FindFirst 5 - AccessDenied почему?
    #39985815
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
 s := 'c:\users\alexey\documents\my music';
 If FindFirst(s + '\*', faAnyFile, sr) = ERROR_ACCESS_DENIED Then
  Begin

   If GetFileAttributes(PChar(s)) And faSymLink <> 0 Then
    WriteLn('junction point');

  End;



Ну а дальше читаешь ссылку.
...
Рейтинг: 0 / 0
FindFirst 5 - AccessDenied почему?
    #39985879
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо!
Всё получилось!
Прежде чем сканировать симв.ссылку, нужно сначала получить полный путь к папке, куда она указывает

Вот рабочая функция:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
// ---------- Получение пути, куда указывает символическая ссылка --------------
// Вх:   PathToSymLink - полный путь к символической ссылке на диске (папке или файлу)
// Вых:  TargetPath    - полный путь к объекту, на который указывает символическая ссылка
// Вых:  '' или текст ошибки
function GetSymLinkTarget(PathToSymLink: string; var TargetPath: string): string;
var
  LinkHandle: THandle;
  Buffer: array[0..MAX_PATH + 1] of Char;
begin
  TargetPath:='';
  result:='';

  LinkHandle := CreateFile(PChar(PathToSymLink), 0, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if LinkHandle <> INVALID_HANDLE_VALUE then
  begin
    try
      if GetFinalPathNameByHandle(LinkHandle, Buffer, MAX_PATH, FILE_NAME_NORMALIZED) > 0 then
        TargetPath:=DeletePrefixFS(Buffer) // сразу удаляем префикс вида \\?\ или \\?\UNC
      else
        result:='code '+IntToStr(GetLastError)+': '+SysErrorMessage(GetLastError);
    finally
      CloseHandle(LinkHandle);
    end;
  end
  else
    result:='code '+IntToStr(GetLastError)+': '+SysErrorMessage(GetLastError);
end;
...
Рейтинг: 0 / 0
FindFirst 5 - AccessDenied почему?
    #39985880
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// ---------------- Убирание префикса '\\?\' или '\\?\UNC\' вначале пути --------------------
function DeletePrefixFS(path: string): string;
var k,len:integer;
begin
  result:=path;
  result:=StringReplace(result, '\\?\', '', [rfReplaceAll]);
  if pos('UNC\',result)=1 then
  begin
    Delete(result, 1, 3);
    result:='\'+result;
  end;
end;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindFirst 5 - AccessDenied почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]