Обычный способ через FileSize для файлов .lnk не работает, всегда выдает -1.
Как проверить существование файла ярлыка WINDOWS (.lnk)?
Сообщений 1 страница 8 из 8
Поделиться202.11.2021 21:49:30
У меня работает именно такой способ, только что проверил.
Поделиться302.11.2021 21:53:46
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)
Поделиться402.11.2021 23:11:20
Отредактировано AZJIO (02.11.2021 23:12:27)
Поделиться502.11.2021 23:48:28
Вот я так понял, исходя из пояснения вопроса автора:
Обычный способ через FileSize для файлов .lnk не работает, всегда выдает -1.
что не получается проверить существование именно файла-ярлыка, а не того, на который он ссылается.
Если вопрос в этом, то обычный способ через FileSize для файлов .lnk работает.
Поделиться603.11.2021 00:52:26
Timon
ну .lnk это обычный файл и FileSize не работать на нём не может, потому подумал в сторону таржета...
kichrot
в дальнейшем лучше добавлять свой кусок кода с ошибкой чтоб понятливей было
Поделиться703.11.2021 03:36:53
Как обычно, путь не верный, а не работает FileSize. А он именно так и работает, если путь неверный то выдаёт -1.
Поделиться803.11.2021 14:21:51
Как обычно, путь не верный, а не работает FileSize. А он именно так и работает, если путь неверный то выдаёт -1.
Да, как обычно, путь оказался неверный. Спасибо.
Полное имя (с путем) у меня вытаскивается и преобразовывается из строковой переменной, при помощи ряда регулярных выражений, на разных этапах алгоритма. Недосмотрел и недодумал, вот и появлялась лишняя двойная кавычка в начале полного имени файла ярлыка.
Нашел бяку и исправил, все заработало.
Всем большое спасибо, за участие и помощь. А то прямо затмение какое то нашло.
Похожие темы
VolCon | PureBasic для Windows | 24.06.2024 |