2012-09-05 3 views
6

Tôi đang gặp sự cố với thuộc tính SelectedPath của FolderBrowserDialog khi thư mục tôi chọn nằm trên máy chủ từ xa và là liên kết tượng trưng (hoặc bất kỳ loại điểm hoàn nguyên nào).FolderBrowserDialog SelectedPath với điểm reparse

Nếu tôi chọn một thư mục bình thường, sau đó tôi nhận được đường dẫn đầy đủ được trả về, ví dụ: "\ SERVER \ folder \ subfolder \ thing_I_clicked_on".

Tuy nhiên, nếu thư mục là một điểm reparse, tôi nhận được chỉ là "\ MÁY CHỦ \ thing_I_clicked_on" (vì vậy nó thiếu đường dẫn đầy đủ)

var dialog = new FolderBrowserDialog(); 
dialog.ShowDialog(); 
MessageBox.Show(dialog.SelectedPath); 

Bất cứ ai đi qua này hoặc có bất cứ đề nghị? Nó không xuất hiện để được quyền liên quan, như thể tôi biết con đường đầy đủ tôi có thể khá vui vẻ duyệt đến nó, vv

+0

bạn đang chạy chương trình như. admin hay gì đó? có lẽ một số công cụ của UNC đang diễn ra ... Tôi không chắc chắn nhưng đó là suy nghĩ của tôi –

+0

Chạy với tư cách quản trị viên không tạo ra bất kỳ sự khác biệt nào tôi sợ: ( –

Trả lời

2

vì vậy, tôi đã nghiên cứu điều này khá nhiều và nghĩ rằng tôi có câu trả lời.

Đầu tiên, một chút giải thích về những gì tôi đã nhìn thấy!

trên máy chủ A, có một phần trong đó có một liên kết tượng trưng cho một chia sẻ trên máy chủ B:

\\serverA\Path\To\Folder 

và mục tiêu đó là

\\serverB\Folder 

gì đã thực sự xảy ra là, giá trị được trả về từ FolderBrowserDialog.SelectedPath\\serverB\Folder và tôi nhầm tưởng rằng nó thiếu các phần của đường dẫn, bởi vì các máy chủ chuỗiA và máy chủB rất giống nhau! Xin lỗi vì đã gây hiểu lầm cho mọi người.

tôi đã tạo wrapper của riêng tôi sau MSDN Example này và nhận thấy rằng shell32.dll chức năng SHGetPathFromIDList được trả lại Target của điểm reparse, mặc dù thực tế rằng các tài liệu nói

Nếu tham số pidl định một phím tắt , các pszPath sẽ chứa đường dẫn đến các phím tắt, không để mục tiêu của shortcut

tôi đã thông báo rằng con đường trước đó là điều đúng, mặc dù vậy trong phương thức callback của tôi khi tình trạng thay đổi, tôi nắm bắt được chưa được dịch được lựa chọn con đường

private int FolderBrowserCallback(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData) 
     { 
      switch (msg) 
      { 
       case BrowseForFolderMessages.BffmSelchanged: 
        if (haveValidPath && !String.IsNullOrEmpty(displayedPath)) 
           { 
            if (IntPtr.Zero != _hwndEdit) 
            { 
             SelectedFullPath = displayedPath; 
            } 
     } 

Vì vậy, các SelectedFullPath tài sản chứa \\serverA\Path\To\FolderSelectedPath tài sản chứa \\ServerB\Folder, mà để lại cho tôi rất nhiều để làm việc với.

1

How do I programmatically access the target path of a windows symbolic liên kết phải ở đây. Bạn có chắc chắn rằng bạn cần chính xác đường dẫn đầy đủ, không đường dẫn đến điểm thô? Tôi nghĩ bạn có thể sử dụng đường dẫn này để thay thế. "Notethat Windows không hỗ trợ các nút nối đến các thư mục trên các chia sẻ từ xa." proof

+0

Hi - dù đầy đủ hay tương đối, tôi cần toàn bộ con đường, cảm ơn cho các liên kết - cửa sổ hoàn toàn không cho phép liên kết tượng trưng đến thư mục từ xa mặc dù (nút giao và liên kết symblic là cả hai điểm reparse nhưng không giống nhau): mklink/DC: \ blah \\ server \ path \ to \ blah –

+0

Ha! Có vẻ như đây là câu trả lời: [link] (http://blogs.msdn.com/b/oldnewthing/archive/2010/02/12/9962359.aspx) – cdmnk

1

Câu trả lời của Andy có vẻ như nó sẽ hoạt động ngoại trừ các chi tiết bị thiếu và tôi không thể tìm ra nơi để thêm đoạn mã của mình vào mã mẫu MSDN. Tôi có thể nhận được mẫu "MSDN mẫu" để làm việc, chỉ cần không biết nơi để trượt trong công cụ của Andy. Vì vậy ... cho những người bạn như tôi, những người không thể tìm ra những gì phải làm với mã trên, (Tôi thực sự muốn tôi biết những gì tôi đã làm;) đây là một loại giải pháp workaround lame.

Sử dụng lớp đệ trình thay cho trình duyệt tìm kiếm và đặt;

  • DereferenceLinks tài sản = false
  • CheckFileExists = false
  • filename = a filename mặc định không có thật. (Cho người dùng biết rằng tên tệp là không quan trọng vì họ chỉ chọn một thư mục.)
  • Sử dụng OpenFileDialog hoặc SaveFileDialog.

Lưu ý rằng khi điều này được thực hiện, nếu người dùng nhấp vào lối tắt cửa sổ cũ (* .lnk) nó (phím tắt) sẽ được trả về làm tên tệp, vì vậy bạn sẽ phải tính đến điều đó.

Hope this helps;) (Tôi sẽ làm việc trên nhận được một số "danh tiếng" vì vậy tôi có thể bình luận về bài đăng của Andy để có được những thông tin chi tiết cho câu trả lời của ông kể từ khi nó trông thật sự tốt đẹp)