2011-01-10 52 views
10

Có an toàn để lập trình tham khảo các thư mục công cộng thông qua:Làm thế nào để tham khảo thư mục C: Users thư mục Public lập trình trong C#

Directory = System.Environment.GetEnvironmentVariable("public")+"MyCompanyName" // etc. 

hoặc là có một cách tốt hơn?

Một lần nữa, điều gì xảy ra nếu ai đó xóa biến môi trường cho công chúng và điều này có an toàn để sử dụng cho các hệ điều hành ngôn ngữ khác nhau không?

này sau: How to install to the Public directory in Windows 7 from the VS 2010 deployment Setup Project

+1

Lưu ý, tôi khuyên bạn nên sử dụng [Path.Combine] (http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx) như trái ngược với nối cho các thư mục. –

+0

Bạn có quan tâm đến khả năng tương thích ngược với Windows XP không? Biến môi trường% public% dường như đã được giới thiệu với Vista; WinXP có một biến môi trường% allusersprofile% trỏ tới% systemdrive% \ Documents and Settings \ Tất cả người dùng nhưng% public% là không xác định. – 48klocs

+0

Cảm ơn thông tin; Không có điều này là hoàn toàn cho Vista/7. – Jeb

Trả lời

10

Nó phụ thuộc vào những gì bạn muốn đạt được. Có một enum gọi là SpecialFolder. Bạn có thể sử dụng nó để lấy Path cho một số thư mục. Ví dụ:

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory) 

trỏ đến "C: \ Users \ Public \ Desktop".

IMHO, cách của bạn không sai, mặc dù tôi sẽ thực hiện một số Xử lý ngoại lệ trong trường hợp EnvVar thực sự bị thiếu. Ngoài ra, bạn có thể sử dụng ENUM với "CommonDesktopDirectory" và loại bỏ phần "\ Desktop".

+1

Không chắc tại sao điều này được đánh dấu là câu trả lời hoặc thậm chí bình chọn khi nó sai. CommonDesktopDirectory không phải là một enum hợp lệ cho .Net 3.5 là những gì được sử dụng cho VS2008, đó là cách câu hỏi được gắn thẻ. – Steve

9

Điều này có vẻ một chút nghi ngờ, nhưng nó nên công việc:

// This should give you something like C:\Users\Public\Documents 
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments); 

var directory = new DirectoryInfo(documentsPath); 

// Now this should give you something like C:\Users\Public 
string commonPath = directory.Parent.FullName; 
+0

Cảm ơn thông tin. Rất tiếc, dự án của tôi hiện đang nhắm mục tiêu 3.5 của khung .Net không loại trừ thành viên liệt kê CommonDocuments (chúng tôi muốn giữ các thay đổi ở mức tối thiểu giữa phần mềm cũ và phần mềm tương thích với Windows 7). – Jeb

3

Nếu bạn muốn có một nơi để đưa dữ liệu ứng dụng cụ thể mà có thể truy cập bởi tất cả người dùng, sử dụng làm cơ sở:

Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 

Ngoài ra, hãy cân nhắc sử dụng Path.Combine để kết hợp các yếu tố với tạo một đường dẫn mới:

Path.Combine(
    Environment.GetFolderPath(SpecialFolder.CommonApplicationData), 
    "MyCompanyName") 
+0

Cảm ơn thông tin. Có, đây là dữ liệu có thể được truy cập bởi tất cả người dùng, nhưng nó cũng sẽ được hiển thị cho họ trong cửa sổ thám hiểm, tức là họ có thể nhấp đúp và mở các tệp này trực tiếp, do đó C: \ ProgramData theo ý kiến ​​của tôi không phù hợp vì đây là thư mục ẩn. – Jeb

+0

Lưu ý một vấn đề tiềm ẩn khác là thư mục ProgramData có các đặc quyền hạn chế, ví dụ: http://stackoverflow.com/questions/22107812/privileges-owner-issue-when-writing-in-c-programdata – DAG

5

Lưu ý rằng Environment.SpecialFolder.CommonDesktopDirectory chỉ khả dụng trong .NET 4.0. Đối với các hệ thống .NET 3.5 của tôi (Windows 7 hoặc XP), tôi đã sử dụng khóa đăng ký cho Thư mục Shell. Đoạn mã của tôi nằm trong VB.NET.

Private mRegShellPath="Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" 
Private mCommonDesktop = Nothing 

' dgp rev 3/8/2012 
Private ReadOnly Property CommonDesktop As String 
    Get 
     If mCommonDesktop Is Nothing Then 
      Dim RegKey As RegistryKey 
      Try 
       RegKey = Registry.LocalMachine.OpenSubKey(mRegShellPath, False) 
       mCommonDesktop = RegKey.GetValue("Common Desktop") 
      Catch ex As Exception 
       mCommonDesktop = "" 
      End Try 
     End If 

     Return mCommonDesktop 
    End Get 

End Property 
1

Bạn có thể nhận được tất cả những ký tự đại diện%% literals bằng cách nhìn vào

Windows-> Start -> regedit ->

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

Sau đó, bạn thực hiện

using System; 
string path2Downloads = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"); 

string path2Music = Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Music"); 

... và, v.v ...và để kiểm tra:

using System.IO; 

string[] files = { "" }; 
if (Directory.Exists(path2Music)) { 
    files = Directory.GetFiles(path2Music); 
} 
Các vấn đề liên quan