18

Trong .Net, chúng ta có thể truy xuất đường dẫn đến 'thư mục đặc biệt', như Documents/Desktop vv. Hôm nay tôi cố gắng tìm đường dẫn đến thư mục 'Downloads', nhưng nó không đủ đặc biệt.Làm thế nào để lấy được các thư mục tải xuống cửa sổ theo chương trình "% USERPROFILE%/Tải xuống"?

Tôi biết tôi chỉ có thể thực hiện 'C: \ Users \ Username \ Downloads', nhưng điều đó có vẻ là một giải pháp xấu. Vậy làm thế nào tôi có thể truy xuất đường dẫn bằng .Net?

Trả lời

0

Các vấn đề của bạn câu trả lời đầu tiên là nó sẽ cung cấp cho bạn kết quả WRONG nếu Dirload tải xuống mặc định đã được thay đổi thành [Download1]! Cách thích hợp để làm điều đó bao gồm tất cả khả năng là

using System; 
using System.Runtime.InteropServices; 

static class cGetEnvVars_WinExp { 
    [DllImport("Shell32.dll")] private static extern int SHGetKnownFolderPath(
     [MarshalAs(UnmanagedType.LPStruct)]Guid rfid, uint dwFlags, IntPtr hToken, 
     out IntPtr ppszPath); 

    [Flags] public enum KnownFolderFlags : uint { SimpleIDList = 0x00000100 
     , NotParentRelative = 0x00000200, DefaultPath = 0x00000400, Init = 0x00000800 
     , NoAlias = 0x00001000, DontUnexpand = 0x00002000, DontVerify = 0x00004000 
     , Create = 0x00008000,NoAppcontainerRedirection = 0x00010000, AliasOnly = 0x80000000 
    } 
    public static string GetPath(string RegStrName, KnownFolderFlags flags, bool defaultUser) { 
     IntPtr outPath; 
     int result = 
      SHGetKnownFolderPath (
       new Guid(RegStrName), (uint)flags, new IntPtr(defaultUser ? -1 : 0), out outPath 
      ); 
     if (result >= 0)   { 
      return Marshal.PtrToStringUni(outPath); 
     } else { 
      throw new ExternalException("Unable to retrieve the known folder path. It may not " 
       + "be available on this system.", result); 
     } 
    } 

} 

Để kiểm tra nó, nếu bạn đặc biệt muốn tải dir cá nhân của bạn, bạn mặc định cờ false ->

using System.IO; 
class Program { 
    [STAThread] 
    static void Main(string[] args)  { 
     string path2Downloads = string.Empty; 
     path2Downloads = 
      cGetEnvVars_WinExp.GetPath("{374DE290-123F-4565-9164-39C4925E467B}", cGetEnvVars_WinExp.KnownFolderFlags.DontVerify, false); 
     string[] files = { "" }; 
     if (Directory.Exists(path2Downloads)) { 
      files = Directory.GetFiles(path2Downloads); 
     } 
    }//Main 
} 

Hoặc chỉ cần một dòng [ sử dụng Environment.ExpandEnvironmentVariables()] -> (giải pháp đơn giản nhất)

using System.IO; 
class Program { 
    [STAThread] 
    static void Main(string[] args)  { 
     string path2Downloads = string.Empty; 
     string[] files = { "" }; 
     path2Downloads = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"); 
     if (Directory.Exists(path2Downloads)) { 
      files = Directory.GetFiles(path2Downloads); 
     } 
    }//Main 
} 
19

Có điều đặc biệt là việc khám phá tên của thư mục này không thể thực hiện được cho đến Vista. .NET vẫn cần hỗ trợ các hệ điều hành trước. Bạn có thể PInvoke SHGetKnownFolderPath() để vượt qua hạn chế này, như thế này:

using System.Runtime.InteropServices; 
... 

public static string GetDownloadsPath() { 
    if (Environment.OSVersion.Version.Major < 6) throw new NotSupportedException(); 
    IntPtr pathPtr = IntPtr.Zero; 
    try { 
     SHGetKnownFolderPath(ref FolderDownloads, 0, IntPtr.Zero, out pathPtr); 
     return Marshal.PtrToStringUni(pathPtr); 
    } 
    finally { 
     Marshal.FreeCoTaskMem(pathPtr); 
    } 
} 

private static Guid FolderDownloads = new Guid("374DE290-123F-4565-9164-39C4925E467B"); 
[DllImport("shell32.dll", CharSet = CharSet.Auto)] 
private static extern int SHGetKnownFolderPath(ref Guid id, int flags, IntPtr token, out IntPtr path); 
+1

Có cách nào để thực hiện công việc này trên Windows được bản địa hóa, trước Vista? I E. 'Path.Combine (đường dẫn," Tải xuống ");' sẽ không hoạt động, vì thư mục được gọi là 'Téléchargements', không phải' Tải xuống'. –

+0

Bạn có thể khai thác nó ra khỏi registry ở đâu đó. Tôi không biết ở đâu, tôi đã nghỉ hưu XP từ lâu rồi. Regedit.exe rất hữu ích để tìm lại. –

+0

Tại sao nên sử dụng 'SHGetKnownFolderPath' chứ không phải' Environment.SpecialFolder'? – Kiquenet

-3

Đối với VB, hãy thử ...

Dim strNewPath As String = IO.Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)) + "\Downloads\" 
+1

Điều này sai, s. nhận xét của tôi ở đây: http://www.codeproject.com/Articles/878605/Getting-all-Special-Folders-in-NET –

+0

Không có đường dẫn mã cứng ở đây. Người dùng có thể đã chuyển thư mục sang vị trí khác (khá dễ dàng trong 8, 8.1 và 10) ... –

0

tôi sẽ cố gắng:

Dim Dd As String = Environment.GetFolderPath(Environment.SpecialFolder.Favorites) 
Dim downloD As String = Dd.Replace("Favorites", "Downloads") 
txt1.text = downLoD 
+0

Đăng câu trả lời cho câu hỏi được đăng và trả lời 6 năm trước - Vui lòng giải thích lý do giải pháp của bạn tốt hơn sử dụng hiện tại –

+0

*** Vui lòng giải thích tại sao giải pháp của bạn tốt hơn để sử dụng hơn so với một giải pháp hiện có? Tốt hơn không nên sử dụng 'SHGetKnownFolderPath'? – Kiquenet

+2

** Không phải giải pháp thần thánh: ** 'Người dùng có thể đã di chuyển thư mục đến một vị trí khác (khá dễ dàng trong 8, 8.1 và 10) .' [Nhận tất cả" Thư mục đặc biệt "trong .NET] (https: // www.codeproject.com/articles/878605/getting-all-special-folders-in-net) – Kiquenet

Các vấn đề liên quan