Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 FindFirst 5 - AccessDenied почему?  [new]
m52
Member

Откуда:
Сообщений: 738
Здравствуйте,

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

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

Заранее благодарен.

К сообщению приложен файл. Размер - 13Kb
30 июл 20, 20:01    [22175875]     Ответить | Цитировать Сообщить модератору
 Re: FindFirst 5 - AccessDenied почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4513
m52,

Это не символьная ссылка, это точка соединения. Читать нужно по-другому: http://codeverge.com/embarcadero.delphi.win32/using-findfirst-findnext-to-recurse/1055198
30 июл 20, 20:37    [22175881]     Ответить | Цитировать Сообщить модератору
 Re: FindFirst 5 - AccessDenied почему?  [new]
m52
Member

Откуда:
Сообщений: 738
ну все равно непонятно, как имея путь вида
"C:\Users\academ\Documents\Мои видеозаписи"
"C:\Users\academ\Documents\мои рисунки"
"C:\Users\academ\Documents\Моя музыка"
понять, что это не просто папка, а точка соединения и прочитать ее листинг (список файлов и папок в ней)

Просто FindFirst("C:\Users\academ\Documents\Мои видеозаписи\*.*") не получится, т.к. будет 5-AccessDenied.
1 авг 20, 17:02    [22176551]     Ответить | Цитировать Сообщить модератору
 Re: FindFirst 5 - AccessDenied почему?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4513
m52,

 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;


Ну а дальше читаешь ссылку.
1 авг 20, 18:45    [22176566]     Ответить | Цитировать Сообщить модератору
 Re: FindFirst 5 - AccessDenied почему?  [new]
m52
Member

Откуда:
Сообщений: 738
Всем спасибо!
Всё получилось!
Прежде чем сканировать симв.ссылку, нужно сначала получить полный путь к папке, куда она указывает

Вот рабочая функция:
// ---------- Получение пути, куда указывает символическая ссылка --------------
// Вх:   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;
2 авг 20, 11:56    [22176655]     Ответить | Цитировать Сообщить модератору
 Re: FindFirst 5 - AccessDenied почему?  [new]
m52
Member

Откуда:
Сообщений: 738
// ---------------- Убирание префикса '\\?\' или '\\?\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;
2 авг 20, 11:59    [22176656]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить