2012-02-23 38 views
14

Làm thế nào để bạn nhận được mục tiêu thư mục của một thư mục phím tắt? Tôi đã tìm kiếm ở khắp mọi nơi và chỉ tìm thấy mục tiêu của tệp lối tắt.Lấy mục tiêu của thư mục phím tắt

+1

điều này không liên quan đến WPF ở tất cả, tôi loại bỏ các thẻ –

+0

Đây là giải pháp tôi thích: [Làm cách nào để lấy tên đường dẫn từ lối tắt tệp?] (http://stackoverflow.com/a/13079688/3757210) – ilcorvo

Trả lời

22

Tôi nghĩ rằng bạn sẽ cần phải sử dụng COM và thêm một tham chiếu đến "Microsoft Shell kiểm soát và tự động hóa", như mô tả trong this blog post:

Dưới đây là một ví dụ bằng cách sử dụng mã được cung cấp có:

namespace Shortcut 
{ 
    using System; 
    using System.Diagnostics; 
    using System.IO; 
    using Shell32; 

    class Program 
    { 
     public static string GetShortcutTargetFile(string shortcutFilename) 
     { 
      string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename); 
      string filenameOnly = System.IO.Path.GetFileName(shortcutFilename); 

      Shell shell = new Shell(); 
      Folder folder = shell.NameSpace(pathOnly); 
      FolderItem folderItem = folder.ParseName(filenameOnly); 
      if (folderItem != null) 
      { 
       Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
       return link.Path; 
      } 

      return string.Empty; 
     } 

     static void Main(string[] args) 
     { 
      const string path = @"C:\link to foobar.lnk"; 
      Console.WriteLine(GetShortcutTargetFile(path)); 
     } 
    } 
} 
+0

Cảm ơn! Bây giờ tôi chỉ cần tìm hiểu làm thế nào để tìm một thư mục shortcuf programmaticaly :) –

+2

Tôi làm việc trên Windows 7 64 bit, và nó không thành công trong việc tìm kiếm lối tắt đến VirtualBox được cài đặt trong 'C: \ Program Files \ Oracle \ VirtualBoxOSX'. Nó tiếp tục trả về mục tiêu trong 'C: \ Program Files (x86) \ Oracle \ VirtualBoxOSX \ VirtualBox.exe'. Bất kỳ lời giải thích về hành vi này? – swdev

+0

Sử dụng Shell32 với phương pháp này chỉ cho phép trong ứng dụng chuỗi đơn. Bạn phải đưa [STAThread] vào điểm vào chính. Bạn sẽ nhận được ngoại lệ trong thử nghiệm đơn vị với mã này vì kiểm tra đơn vị không cho phép STAThread. xem [answer] (http://stackoverflow.com/questions/14543340/calling-shell32-dll-from-net-windows-service). Ngoài ra còn có giải pháp để chạy mã này trong thử nghiệm đơn vị, xem http://haacked.com/archive/2014/11/20/xunit-and-sta/ – yancyn

-2

Tất cả các lối tắt tệp đều có đuôi tệp .lnk mà bạn có thể kiểm tra. Sử dụng một chuỗi ví dụ, bạn có thể sử dụng string.EndsWith (". Lnk") làm bộ lọc.

Tất cả các phím tắt URL đều có đuôi tệp .url, vì vậy, bạn cũng sẽ cần phải tính đến những tiện ích đó nếu cần.

+1

OP hỏi cách lấy thư mục đích của phím tắt, chứ không phải cách kiểm tra xem đó có phải là lối tắt hay không. –

0

nếu bạn muốn tìm con đường ứng dụng của bạn đã tắt trên máy tính để bàn, một cách dễ dàng mà tôi sử dụng, như sau:

Process.GetCurrentProcess().MainModule.FileName.Substring(0, Process.GetCurrentProcess().MainModule.FileName.LastIndexOf("\\") 

mã trở lại này bất kỳ con đường exe đang chạy, dù rằng người yêu cầu tập tin

1

Một cách đơn giản hơn để có được những đường liên kết mà tôi sử dụng là:

private static string LnkToFile(string fileLink) 
{ 
    string link = File.ReadAllText(fileLink); 
    int i1 = link.IndexOf("DATA\0"); 
    if (i1 < 0) 
     return null; 
    i1 += 5; 
    int i2 = link.IndexOf("\0", i1); 
    if (i2 < 0) 
     return link.Substring(i1); 
    else 
     return link.Substring(i1, i2 - i1); 
} 

Nhưng nó sẽ break nhiên nếu định dạng thay đổi lnk-file.

2

Trong cửa sổ 10 nó cần phải được thực hiện như thế này, trước hết phải thêm tài liệu tham khảo COM để "Microsoft Shell kiểm soát và tự động hóa"

// new way for windows 10 
string targetname; 
string pathOnly = System.IO.Path.GetDirectoryName(LnkFileName); 
string filenameOnly = System.IO.Path.GetFileName(LnkFileName); 

Shell shell = new Shell(); 
Shell32.Folder folder = shell.NameSpace(pathOnly); 
FolderItem folderItem = folder.ParseName(filenameOnly); 
if (folderItem != null) { 
    Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
    targetname = link.Target.Path; // <-- main difference 
    if (targetname.StartsWith("{")) { // it is prefixed with {54A35DE2-guid-for-program-files-x86-QZ32BP4} 
    int endguid = targetname.IndexOf("}"); 
    if (endguid > 0) { 
     targetname = "C:\\program files (x86)" + targetname.Substring(endguid + 1); 
    } 
} 
Các vấn đề liên quan