2011-01-10 5 views
10

Ist es sicher, die öffentlichen Ordner durch programmatisch zu verweisen:Wie die C verweisen: Users Public Verzeichnis programmatisch in C#

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

oder gibt es einen besseren Weg?

Noch einmal, was ist, wenn jemand die Umgebungsvariable für die Öffentlichkeit löscht, und ist dies sicher für verschiedene Sprach-OSs zu verwenden?

Dies folgt: How to install to the Public directory in Windows 7 from the VS 2010 deployment Setup Project

+1

Als Randbemerkung, Ich empfehle, mit [Path.Combine] (http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx) als gegen Verkettung für Verzeichnisse. –

+0

Haben Sie Bedenken hinsichtlich der Abwärtskompatibilität mit Windows XP? Die Umgebungsvariable% public% scheint mit Vista eingeführt worden zu sein; WinXP verfügt über eine Umgebungsvariable% allusersprofile%, die auf% systemdrive% \ Dokumente und Einstellungen \ All Users verweist, aber% public% ist nicht definiert. – 48klocs

+0

Danke für die Info; Nein, das ist nur für Vista/7. – Jeb

Antwort

10

Es hängt davon ab, was Sie erreichen wollen. Es gibt eine Enum namens SpecialFolder. Sie können es verwenden, um den Pfad zu einigen Verzeichnissen zu erhalten. Beispiel:

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

Punkte auf "C: \ Users \ Public \ Desktop".

IMHO, ist Ihr Weg nicht falsch, obwohl ich einige Exception Handling tun würde, falls der EnvVar wirklich fehlt. Sie könnten auch das ENUM mit "CommonDesktopDirectory" verwenden und den "\ Desktop" -Teil loswerden.

+1

Nicht sicher, warum dies als Antwort markiert wurde oder sogar abgestimmt, wenn es falsch ist. CommonDesktopDirectory ist keine gültige Enumeration für .Net 3.5, was für VS2008 verwendet wird, und so wird die Frage markiert. – Steve

9

Dies scheint ein bisschen fragwürdig, aber es sollte Arbeit:

// 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

Danke für die Info. Leider zielt mein Projekt derzeit auf 3.5 des .Net-Frameworks ab, das das CommonDocuments-Enumerationsmitglied nicht ausschließt (wir möchten Änderungen auf ein Minimum zwischen unserer alten und der neuen Software, die mit Windows 7 kompatibel ist, beibehalten). – Jeb

3

Wenn Sie einen Platz setzen anwendungsspezifische Daten möchten, die von allen Benutzern zugegriffen kann, verwenden als Basis:

Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 

bedenken Sie auch Path.Combine unter Verwendung von Elementen zu kombinieren, um einen neuen Pfad bilden:

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

Danke für die Information. Ja, das sind Daten, auf die alle Benutzer zugreifen können, aber sie sollten auch für sie im Windows Explorer sichtbar sein, dh sie können doppelklicken und diese Dateien direkt öffnen, daher ist C: \ ProgramData meines Erachtens nicht geeignet, da dies ein versteckter Ordner – Jeb

+0

Beachten Sie ein anderes potentielles Problem, dass der ProgramData-Ordner eingeschränkte Rechte hat, zB http://stackoverflow.com/questions/22107812/privileges-owner-issue-when-writing-in-c-programdata – DAG

5

Beachten Sie, dass das Environment.SpecialFolder.CommonDesktopDirectory nur in .NET 4.0 verfügbar ist. Für meine .NET 3.5-Systeme (Windows 7 oder XP) habe ich den Registrierungsschlüssel für die Shell-Ordner verwendet. Mein Code-Snippet befindet sich in 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

Sie können alle diese Platzhalter%% Literale erhalten, indem man in

Windows-> Start -> regedit ->

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

Dann Sie führen

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

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

... und so weiter ....und zu testen:

using System.IO; 

string[] files = { "" }; 
if (Directory.Exists(path2Music)) { 
    files = Directory.GetFiles(path2Music); 
} 
Verwandte Themen