Чтение цели ярлыка с помощью Go

Я пытаюсь прочитать целевой файл/каталог файла ярлыка (.lnk) с помощью Go.

У меня уже есть цикл для всех файлов в каталоге, и я могу успешно определить, является ли это каталогом с IsDir() или файлом IsRegular(). Теперь мне нужен способ прочитать, является ли это ссылкой, и, если это .lnk, путь к ней, чтобы я мог ее распечатать.

Я не мог найти способ сделать это, и я искал SO, но ничего не появляется. Любая идея?


person CoppolaEmilio    schedule 24.05.2017    source источник


Ответы (1)


Вам необходимо ознакомиться с двоичным форматом lnk, определенным Microsoft.

В Go его структура будет переведена в (как используется в exponential-decay/shortcuts)

//structs that make up the shortcut specification [76 bytes] 
type ShellLinkHeader struct {
   HeaderSize  [4]byte           //HeaderSize
   ClassID     [16]byte          //LinkCLSID
   LinkFlags   uint32            //LinkFlags      [4]byte
   FileAttr    uint32            //FileAttributes [4]byte
   Creation    [8]byte           //CreationTime
   Access      [8]byte           //AccessTime
   Write       [8]byte           //WriteTime
   FileSz      [4]byte           //FileSize
   IconIndex   [4]byte           //IconIndex
   ShowCmd     [4]byte           //ShowCommand

   //[2]byte HotKey values for shortcut shortcuts
   HotKeyLow   byte              //HotKeyLow
   HotKeyHigh  byte              //HotKeyHigh

   Reserved1   [2]byte           //Reserved1
   Reserved2   [4]byte           //Reserved2
   Reserved3   [4]byte           //Reserved3
}

Этот проект должен дать вам представление о том, как расшифровать цель ярлыка.

person VonC    schedule 24.05.2017
comment
os.Readlink(путь) не работает в Windows? - person jrefior; 25.05.2017
comment
@jrefior для символической ссылки (mklink или, возможно, соединение: mklink /J), как показано на github.com/golang/ перейти/проблемы/15978. Не для ярлыка (lnk) - person VonC; 25.05.2017
comment
@VonC, можете ли вы написать небольшой пример того, как получить эту информацию? Я очень потерялся с этим :( - person CoppolaEmilio; 25.05.2017
comment
@CoppolaEmilio Я сделаю это завтра (сейчас немного поздно) - person VonC; 25.05.2017
comment
@VonC Извините, что надоедаю вам, но не могли бы вы мне помочь сейчас? Я хочу принять ответ :) - person CoppolaEmilio; 25.05.2017
comment
@CoppolaEmilio Я не продвинулся далеко: вы можете клонировать репозиторий и создать его: он даст вам shortcut.exe утилиту, которую вы можете использовать в своем .lnk файле: shortcut -file c:\path\to\ashortcut.lnk. Но путь назначения не определяется напрямую. Я подозреваю, что его необходимо интерпретировать и собрать заново в соответствии со спецификацией Microsoft. - person VonC; 25.05.2017
comment
@CoppolaEmilio Короче говоря, это помогает вам расшифровать структуру файла .lnk, но для получения фактического пути назначения требуется немного больше работы. - person VonC; 25.05.2017