NAME

Parse::Lnk - A cross-platform, depencency free, Windows shortcut (.lnk) meta data parser.

VERSION

Version 0.04

SYNOPSIS

This module reads Win32 shortcuts (*.lnk files) to obtain the meta data in them.

Its goal is to be able to resolve the path they point to (along with other data), from any platform/OS, without the need for depencencies.

Its use is very simple:

use Parse::Lnk;

my $data = Parse::Lnk->from($filename);

# $data is now a hashref if the file was parsed successfully.
# undef if not.

##########
# Or ... #
##########

use Parse::Lnk qw(parse_lnk);

my $data = parse_lnk $filename;

# $data is now a hashref if the file was parsed successfully.
# undef if not.

##########
# Or ... #
##########

use Parse::Lnk qw(resolve_lnk);

my $path = resolve_lnk $filename;

# $path is now a string with the path the lnk file points to.
# undef if the lnk file was not parsed successfully.

###############################################################
# Or, if you want a little more information/control on errors #
###############################################################

use Parse::Lnk;

my $lnk = Parse::Lnk->new;

$lnk->parse($filename) or die $lnk->{error};

# Or:

$lnk->parse($filename);

if ($lnk->{error}) {
    # ... do your own error handling;
}

EXPORT

Nothing is exported by default. You can explicitly import this functions:

parse_lnk($filename)

This will return a Parse::Lnk instance, which is a hashref. The keys in that hashref depend on the data that was parsed from the .lnk file.

It will return undef on error.

use Parse::Lnk qw(parse_lnk);

my $lnk = parse_lnk $filename;

if ($lnk) {
    print "$filename points to path $lnk->{base_path}\n";
    
    my $create_date = localtime $lnk->{create_time};
    print "$filename was created on $create_date";
} else {
    print "Could not parse $filename";
}

resolve_lnk($filename)

This will return the path the .lnk file is pointing to.

It will return undef on error.

use Parse::Lnk qw(resolve_lnk);

my $path = resolve_lnk $filename;

if ($path) {
    print "$filename points to path $path";
} else {
    print "Could not parse $filename";
}

METHODS

You can create a Parse::Lnk instance and call a few methods on it. This may give you more control/information when something goes wrong while parsing the file.

new

This creates a new instance. You can pass the filename value as argument, or you can set/change it later.

use Parse::Lnk;

my $lnk = Parse::Lnk->new(filename => $filename);

# or

my $lnk = Parse::Lnk->new;
$lnk->{filename} = $filename;

parse

This method will parse the current filename in the instance. You can change the value of filename and parse again at any point.

use Parse::Lnk;

my $lnk = Parse::Lnk->new(filename => $filename);

$lnk->parse;

if ($lnk->{error}) {
    # handle the error
} else {
    print "$filename points to $lnk->{base_path}";
}

for my $other_filename (@filenames) {
    $lnk->{filename} = $other_filename;
    $lnk->parse;
    
    if ($lnk->{error}) {
        # handle the error
        next;
    }
    
    print "$other_filename points to $lnk->{base_path}";
}

from

It will return a Parse::Lnk instance, or undef on error. This method was written with plain package name calling in mind:

use Parse::Lnk;

my $lnk = Parse::Lnk->from($filename);

if ($lnk) {
    print "$filename points to path $lnk->{base_path}\n";
    
    my $create_date = localtime $lnk->{create_time};
    print "$filename was created on $create_date";
} else {
    print "Could not parse $filename";
}

AUTHOR

Francisco Zarabozo, <zarabozo at cpan.org>

BUGS

I'm sure there are many. I haven't found bugs with the lnk files I've tested it. If you find a bug or you have a problem reading a shortcut/lnk file, please don't hesitate to report it and don't forget to include the file in question. If you are on Windows, you will have to zip the file in a way that is the lnk file the one being zipped and not the actual directory/file it is pointing to. I promise to look at any report and work on a solution as fast as I can.

Please report any bugs or feature requests to bug-parse-lnk at rt.cpan.org, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Parse-Lnk. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc Parse::Lnk

You can also look for information at:

ACKNOWLEDGEMENTS

LICENSE AND COPYRIGHT

This software is copyright (c) 2021 by Francisco Zarabozo.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.