Поиск по этому блогу

понедельник, 2 июля 2012 г.

Как вытащить путь до файла через ярлык

Изначально я просто решил опробовать Drag and drop в WPF и Win Form. Сделал окошко, где был ListBox, сделал так, чтобы в него можно было перетащить файлы. В ListBox'e показывался путь до этого файла, то есть то место, откуда я  перетащил файл. Потом появилась идея каким - то образом заставить программу выдавать путь до файла, в моём случае через ярлык, узнать, где установлена программа. В общем, нашёлся такой путь решения.
GetFullPath используется как метод-функция.

 // Таким образом узнаем путь до файла, через ярлык
        string GetFullPath(FileInfo file)
        {
            // проверяем, является ли файл ярлыком
            if (file.Extension == ".lnk")
            {
                using (var fstream = File.Open(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = new BinaryReader(fstream))
                    {
                        fstream.Seek(0x14, SeekOrigin.Begin);
                        var flags = reader.ReadUInt32();
                        if ((flags & 0x01) == 1)
                        {
                            fstream.Seek(0x4c, SeekOrigin.Begin);
                            var itemIdLength = reader.ReadUInt16();
                            fstream.Seek(itemIdLength, SeekOrigin.Current);
                        }
                        var start = fstream.Position;
                        var length = reader.ReadUInt32();
                        fstream.Seek(0x0c, SeekOrigin.Current);
                        var offset = reader.ReadUInt32();
                        fstream.Seek(start + offset, SeekOrigin.Begin);
                        return new string(reader.ReadChars((int)(start + length - fstream.Position)));
                    }
                }
            }
            else
                return file.FullName;
        }