2011-12-28 30 views
10

Chúng tôi có một ổ đĩa mạng đầy đủ các phím tắt (các tệp .lnk) trỏ đến các thư mục và tôi cần duyệt qua chúng theo cách lập trình trong ứng dụng C# Winforms.Làm thế nào để theo dõi tệp .lnk theo lập trình

Điều gì thực hiện tùy chọn nào tôi có?

+1

Sử dụng các liên kết giao diện shell: http://msdn.microsoft.com/en-us/library/windows/desktop/bb776891(v=vs.85).aspx –

+1

gì nếu các phím tắt không trỏ đến một tập tin? – vcsjones

+0

@vcsjones Nó có thể bị bỏ qua nếu không. May mắn là nó đã bị khóa và chỉ được các kỹ sư mạng truy cập. – user1231231412

Trả lời

11

Thêm IWshRuntimeLibrary làm tham chiếu đến dự án của bạn. Thêm tham chiếu, tab COM, Mô hình đối tượng lưu trữ của Windows Scripting.

Dưới đây là làm thế nào tôi có được các tính chất của một phím tắt:

IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass(); 
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename); 

Các phím tắt đối tượng "sc" có một tài sản TargetPath.

+6

Cảm ơn ** đề xuất và ví dụ ** đơn giản và thiết thực của bạn và không chỉ cung cấp cho tôi thêm thông tin để tìm hiểu. Một điều tôi sẽ đề nghị thêm vào câu trả lời của bạn là bạn thêm một tham chiếu đến đối tượng COM "Windows Script Host Object Model" để lấy IWshRuntimeLibrary. – user1231231412

+0

Vui vì tôi có thể giúp! – djdanlib

+0

Chỉ cần để không ai khác phải lãng phí quá nhiều thời gian vào những sai lầm ngu ngốc: tên tập tin trong ví dụ trên nên tất nhiên là file.FullName nếu đọc FileInfo, không phải file.Name. – Alex

0
  1. Tải tệp bằng giao diện COM IPersistFile.
  2. Thực hiện QueryInterface trên kết quả để biến nó thành giao diện IShellLink.
  3. Gọi IShellLink :: getPath

Theo như tôi biết bạn có thể có .NET tạo ra các lớp học phù hợp với mỗi người trong số các giao diện cho bạn bằng cách sử dụng "Add Reference" hộp thoại.

+0

Cảm ơn vì điều này. (Những) tệp nào tôi đang thêm làm tham chiếu? – user1231231412

+0

@ JonC: Tôi không biết. Tất cả những gì tôi biết là được cho là bạn có thể thêm CoClass làm tài liệu tham khảo. Không phải thứ tôi đã làm. –

0

Giao diện IShellLink cho phép bạn thao tác các tệp .lnk, mặc dù hơi khó sử dụng từ C#.

This article có một số mã triển khai các gubbins tương tác cần thiết.

Cập nhật

Bạn có thể tìm mã từ bài viết here nhưng trang dường như không làm việc trong Firefox. Nó hoạt động trong IE.

+1

Cảm ơn, nhưng nguồn bị thiếu và anh ta không chi tiết bất cứ điều gì hữu ích trong blog. – user1231231412

+0

@ JonC: Tôi tìm thấy nguồn, xem cập nhật của tôi ở trên. – arx

0

Tôi biết nó không phải là cách chính xác và cấu trúc tập tin lnk có thể thay đổi vv, nhưng đây là những gì tôi làm:

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); 
    } 
1

Nếu bạn không muốn tham khảo COM, và phân phối các Interop. IWshRuntimeLibrary.dll với sản phẩm của bạn (nhớ Jay Riggs "Nhúng Interop Types": False)

Bạn có thể sử dụng COM động mới thay thế.

private void Window_Drop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
     dynamic shortcut; 
     dynamic windowsShell; 
     try 
     { 
      var file = files[0]; 
      if (Path.GetExtension(file)?.Equals(".lnk",StringComparison.OrdinalIgnoreCase) == true) 
      { 
       Type shellObjectType = Type.GetTypeFromProgID("WScript.Shell"); 
       windowsShell = Activator.CreateInstance(shellObjectType); 
       shortcut = windowsShell.CreateShortcut(file); 
       file = shortcut.TargetPath; 
       // Release the COM objects 
       shortcut = null; 
       windowsShell = null; 
      } 
      // 
      // <use file>... 
      // 
     } 
     finally 
     { 
      // Release the COM objects 
      shortcut = null; 
      windowsShell = null; 
     } 
    } 
} 
Các vấn đề liên quan