PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как проверить существование файла ярлыка WINDOWS (.lnk)?


Как проверить существование файла ярлыка WINDOWS (.lnk)?

Сообщений 1 страница 8 из 8

1

Обычный способ через FileSize для файлов .lnk не работает, всегда выдает -1.

0

2

У меня работает именно такой способ, только что проверил.

0

3

http://forums.purebasic.com/english/vie … 14#p537581

Код:
Structure ShellLinkHeaderStr
  HeaderSize.l
  LinkCLSID.a[16]
  LinkFlags.l
  FileAttributes.l
  CreationTime.q
  AccessTime.q
  WriteTime.q
  FileSize.l
  IconIndex.l
  ShowCommand.l
  HotKey.w
  Reserved1.w
  Reserved2.l
  Reserved3.l
EndStructure

Structure LinkInfoStr
  LinkInfoSize.l
  LinkInfoHeaderSize.l
  LinkInfoFlags.l
  VolumeIDOffset.l
  LocalBasePathOffset.l
  CommonNetworkRelativeLinkOffset.l
  CommonPathSuffixOffset.l
  LocalBasePathOffsetUnicode.l
  CommonPathSuffixOffsetUnicode.l
EndStructure


Enumeration ; neccessary LinkFlags
  #HasLinkTargetIDList
  #HasLinkInfo
EndEnumeration


Procedure.s GetLinkTarget(FileName$)

  If ReadFile(0, Filename$)
   
    Define ByteLengthW.w, ByteLengthL.l, CharLength.w
   
    ReadData(0, @ByteLengthL, 4)
    FileSeek(0, 0)
    *Header = AllocateMemory(ByteLengthL)
    If ReadData(0, *Header, ByteLengthL) = ByteLengthL
     
      *ShellLinkHeader.ShellLinkHeaderStr = *Header
     
      If *ShellLinkHeader\LinkFlags & (1 << #HasLinkTargetIDList)
        ReadData(0, @ByteLengthW, 2)
        ; skip the LinkTargetIDList for now
        FileSeek(0, Loc(0) + ByteLengthW)
      EndIf
     
      Pos = Loc(0)
     
      If *ShellLinkHeader\LinkFlags & (1 << #HasLinkInfo)
        ReadData(0, @BytelengthL, 4)
        If ByteLengthL > 0
          FileSeek(0, Pos)
          *Buffer = AllocateMemory(ByteLengthL)
          If ReadData(0, *Buffer, ByteLengthL) = ByteLengthL
            *LinkInfo.LinkInfoStr = *Buffer
            Target$ = PeekS(*Buffer + *LinkInfo\LocalBasePathOffset,-1,#PB_Ascii)
            Target$ + PeekS(*Buffer + *LinkInfo\CommonPathSuffixOffset,-1,#PB_Ascii)
          Else
            Target$ = "Error: A fault occured"
          EndIf
          FreeMemory(*Buffer)
        EndIf
      Else
        Target$ = "Error: " + Filename$ + " has no LinkInfo"
      EndIf
     
    EndIf
     
    FreeMemory(*Header)
    CloseFile(0)
  Else
    Target$ = "Error: Was not able to open " + Filename$
  EndIf
 
  ProcedureReturn Target$
 
EndProcedure


link$ = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\PureBasic\PureBasic.lnk"
FilePath$ = GetLinkTarget(link$)
Debug FilePath$ + " (size: " + FileSize(FilePath$) + ")"

Отредактировано Lin (02.11.2021 22:12:29)

0

4

Ссылка

Отредактировано AZJIO (02.11.2021 23:12:27)

0

5

Вот я так понял, исходя из пояснения вопроса автора:

kichrot написал(а):

Обычный способ через FileSize для файлов .lnk не работает, всегда выдает -1.

что не получается проверить существование именно файла-ярлыка, а не того, на который он ссылается.
Если вопрос в этом, то обычный способ через FileSize для файлов .lnk работает.

0

6

Timon
ну .lnk это обычный файл и FileSize не работать на нём не может, потому подумал в сторону таржета...

kichrot
в дальнейшем лучше добавлять свой кусок кода с ошибкой чтоб понятливей было

0

7

Как обычно, путь не верный, а не работает FileSize. А он именно так и работает, если путь неверный то выдаёт -1.

0

8

AZJIO написал(а):

Как обычно, путь не верный, а не работает FileSize. А он именно так и работает, если путь неверный то выдаёт -1.

Да, как обычно, путь оказался неверный. Спасибо. :)

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

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как проверить существование файла ярлыка WINDOWS (.lnk)?