2009-08-11 22 views
8

Tôi cần lưu trữ tệp vào màn hình phổ biến trên Windows. Ứng dụng này là một ứng dụng rất đặc biệt cho chính xác một máy tính đặc biệt (chuẩn bị thiết bị), vì vậy nó phải dễ dàng cho những người dùng không sử dụng công nghệ cao để tìm và sửa đổi tệp cấu hình. Bây giờ chúng tôi chuyển sang một miền, và bởi vì những người khác nhau (với các tài khoản khác nhau) nên sử dụng phần mềm, nó phải ở một nơi chung, được mọi người dùng nhìn thấy. Vì vậy, xin vui lòng không hỏi lý do tại sao nó trên máy tính để bàn;)Nhận đường dẫn máy tính để bàn phổ biến trong .NET

Trước đây, tôi chỉ sử dụng Environment.GetFolderPath(Environment.SpecialFolder.Desktop). Có một số thư mục phổ biến trong số đếm SpecialFolder, nhưng máy tính để bàn thông thường dường như không có ở đó. Tôi có thiếu gì đó không, hoặc tôi có phải p/gọi số SHGetSpecialFolderPath với CSIDL_COMMON_DESKTOPDIRECTORY không?

+0

Bây giờ nó bị bẩn. Thật không may, có vẻ như tôi có mặc định không có quyền ghi vào máy tính để bàn thông thường, điều này làm cho việc này trở nên phức tạp. Bất kỳ đề xuất nào cho vị trí tốt hơn? Hãy nhớ rằng người dùng có thể tìm thấy tệp và tất cả người dùng cần quyền truy cập đọc/ghi. Ứng dụng nên được triển khai bởi XCOPY. – OregonGhost

+0

Trong khi câu hỏi ban đầu vẫn hợp lệ (đặc biệt vì nó không có ở bất kỳ đâu trên SO), tôi nghĩ tôi sẽ phải đi với các tài liệu chung (hoặc bất kỳ tên nào trên hệ thống tiếng Anh). Đó vẫn là loại có thể tìm thấy được bởi người dùng. Bây giờ chúng ta hãy hy vọng tôi có quyền truy cập ghi. Hãy bình luận nếu bạn nghĩ rằng đây là một ý tưởng tốt/xấu. – OregonGhost

+0

Tại sao bạn không lưu trữ chúng trong bộ nhớ máy bị cô lập? –

Trả lời

2

Tôi nghĩ bạn phải sử dụng API SHGetSpecialFolderPath vì không có giá trị enum cho "CommonDesktopDirectory". Bạn không thể sử dụng giá trị CSIDL_COMMON_DESKTOPDIRECTORY một cách rõ ràng và truyền nó đến Environment.SpecialFolder, vì phương thức GetFolderPath kiểm tra giá trị được xác định trong enum. Dưới đây là đoạn code của phương pháp GetFolderPath (từ Reflector):

public static string GetFolderPath(SpecialFolder folder) 
{ 
    if (!Enum.IsDefined(typeof(SpecialFolder), folder)) 
    { 
     throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, GetResourceString("Arg_EnumIllegalVal"), new object[] { (int) folder })); 
    } 
    StringBuilder lpszPath = new StringBuilder(260); 
    Win32Native.SHGetFolderPath(IntPtr.Zero, (int) folder, IntPtr.Zero, 0, lpszPath); 
    string path = lpszPath.ToString(); 
    new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path).Demand(); 
    return path; 
} 

Vì vậy, bạn có thể dễ dàng sao chép và thích ứng với phần mà bạn cần ...

+0

OK, tôi chỉ muốn chắc chắn.Bây giờ tôi đã có một cái nhìn tại các tài liệu MSDN, có một lưu ý rằng trong Vista và sau này, bạn nên sử dụng KNOWNFOLDERID thay vì các giá trị CLSID. Điều đó cũng áp dụng nếu ứng dụng của tôi phải chạy trên XP? – OregonGhost

+0

Không, tôi nghĩ nó chỉ dành cho Vista –

+0

Tôi có thể sẽ đi với một thư mục khác (xem nhận xét của tôi cho câu hỏi), nhưng đây là câu trả lời hay nhất cho câu hỏi, vì vậy tôi đã chấp nhận nó. Cảm ơn trả lời nhắc nhở của bạn. – OregonGhost

0

Để làm rõ - Bằng máy tính để bàn thông thường làm bạn có nghĩa là C: \ Tài liệu và cài đặt \ Tất cả người dùng \ Desktop?

Nếu có, đây là một hack xấu xí -

Dim c As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 
Dim comDesktop As String = c.Substring(0, c.LastIndexOf("\")) + "\Desktop" 
+0

Vâng, ý tôi là vậy. Nhưng nó thực sự xấu xí. – OregonGhost

+0

Nó sẽ phá vỡ ngay sau khi một số hệ thống sử dụng tên khác cho Desktop: p –

0

Đầu tiên, thêm một tham chiếu đến "Windows Script Host Object Mô hình". Bạn sẽ tìm thấy điều này trong tab COM của hộp thoại "Thêm tham chiếu".

using IWshRuntimeLibrary; 

object commonUserDesktop = "AllUsersDesktop"; 
WshShell shell = new WshShellClass(); 
string commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToString(); 
+0

Như tôi đã viết tại câu trả lời của Bogdan_Ch, tôi muốn không sử dụng WSH cho một nhiệm vụ như vậy. P/Gọi là tốt với tôi. – OregonGhost

0

Một cách khác (có nó cũng là xấu xí và sẽ làm việc có lẽ chỉ có trên Windows XP, không phải trên Vista) là để đọc một giá trị từ registry

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Thư mục Explorer \ Shell, Máy tính để bàn phổ biến

+0

Điều này không chỉ xấu xí mà là một cơn ác mộng tương thích. Nếu tôi nhớ chính xác, nó thậm chí là chỉ trong một số phiên bản CTP của Windows, nhưng kể từ khi các ứng dụng dựa vào nó, nó phải được trong Windows trong nhiều thập kỷ. – OregonGhost

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