C # 'da ana dizinin yolunu mu alıyorsunuz?


101

Tamam, Environment.SpecialFolder'ı kontrol ettim ama bunun için içinde hiçbir şey yok.

C # 'da mevcut kullanıcının ev dizinini almak istiyorum. (ör. c:\documents and settings\userXP c:\users\useraltında, Vista /home/useraltında ve Unix altında.)

Bunu bulmak için çevre değişkenlerini okuyabileceğimi biliyorum, ancak bunu platformlar arası bir şekilde yapmak istiyorum.

Bunu .NET ile yapabilmemin herhangi bir yolu var mı (tercihen mscorlib kullanarak)?

GÜNCELLEME : Tamam, bu kullandığım kod:

string homePath = (Environment.OSVersion.Platform == PlatformID.Unix || 
                   Environment.OSVersion.Platform == PlatformID.MacOSX)
    ? Environment.GetEnvironmentVariable("HOME")
    : Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%");

2
BOOM. Batının en hızlı silahı: P
Boris Callens

Makineniz hakkında Dunno, ancak XP kutumda% HOMEDRIVE %% HOMEPATH% c: \ Documents and Settings \ user \ MSalters \
MSalters

Dürüst olmak gerekirse, bu sorunun tam olarak .NET'in yetersiz uygulaması olduğunu düşünüyorum ... tam listesini görmek için CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx ) belgelerine bakmalısınız . Windows'un desteklediği şey: Aslında aradığınız şey, Windows'ta desteklenen, ancak anlaşılmaz bir nedenden ötürü .NET tarafından desteklenmeyen CSIDL_PROFILE'dır.
Matthew Scharley

1
Bence sonucu bir dahaki sefere bir cevaba koymalısın.
Peteter

PlatformID.MacOSX gerekli değildir, PlatformID.Unix de MacOSX'te (veya en azından eskiden olduğu gibi) true değerini döndürür.
Stefan Steiger

Yanıtlar:


51

Environment.SpecialFolder.Personalaslında ana klasöre dönmez, Belgelerim klasörünü döndürür . Win32'de ana klasörü almanın en güvenli yolu okumaktır %HOMEDRIVE%%HOMEPATH%. Ortam değişkenlerini Okuma afiş neden istediğini emin değilim bu yüzden, aslında (Unix ve Windows boyunca) yapmak çok taşınabilir değil bunu.

Eklemek için düzenlendi: Çapraz platform (Windows / Unix) C # için, $HOMEUnix ve OSX ve %HOMEDRIVE%%HOMEPATH%Windows üzerinde okudum .


HOMEDRIVE'ın * nix'te bulunmadığını biliyorum ve normalde HOMEPATH değil, HOME'dur.
Matthew Scharley

Matthew, haklısın. Orijinal yoruma bir açıklama ekledim.
sigint

12
Windows'ta% USERPROFILE% kullanamaz mısınız?
Lucas Jones

1
$ HOME, OS X'te de çalışır. Platform tespiti yaptığınız için endişelendiğim kadarıyla hala doğru cevap değil ... ama istenen tam değerleri elde etmek için yapmanız gereken bu.
Matthew Scharley

2
person-b,% USERPROFILE% ve% HOMEDRIVE %% HOMEPATH%, kişisel PC'lerde genellikle aynıdır, ancak genellikle ağ ortamlarında farklı yerlere işaret eder. Örneğin, işte USERPROFILE benim C: \ Documents and Settings \ kullanıcıadıdır, ancak ana dizini Z: \, BT tarafından düzenli olarak yedeklenen ağa bağlı bir sürücüdür.
sigint

93
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

Kişisel, Belgelerimdir (veya win7 ve üzeri Belgelerdir).


8
UserProfile'ın .NET 4.0'da yeni olduğunu unutmayın, .NET 2.0 / 3.5 kullanıyorsanız, Win32 API'sini UserProfile için 40 değeriyle manuel olarak çağırmanız gerekir
12'de

Ve "Belgelerim", Windows 95, 98 ve ME dışında ana dizin ile aynı değildir.
Jon Hanna

1
Taşınabilir tutmak için dosya yolunuzu oluşturmak için System.IO.Path.DirectorySeparatorChar'ı kullanmayı unutmayın.
thomiel

4
DirectorySeperatorChar'ı manuel olarak kullanmayın. Path.Combine kullanın.
John Gietzen

14

Sanırım aradığınız şey:

System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)

Referans için, infact içinde yer almaktadır mscorlib.


Bu, Belgelerim klasörünü döndürür.
MiffTheFox

"Belgelerim" , Windows'un bir ana dizine en yakın şeydir.
MSalters

8
@MStallers Hayır,% HOMEDRIVE %% HOMEPATH%.
MiffTheFox

Tam olarak değil ... ama alternatifi PInvoke ve OP, yönetilen bir çözüm istedi.
Matthew Scharley

7
Environment.SpecialFolder.UserProfile'ın .NET 4.0'da mevcut olduğunu unutmayın, istediğiniz şey budur
12'de

8

DotNetCore 1.1'de System.Environment.SpecialFoldermevcut değil. 2.0-beta sürümünde mevcut olabilir. O zamana kadar, bunu yapmak için aşağıdakileri kullanabilirsiniz:

var envHome = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "HOMEPATH" : "HOME";
var home = Environment.GetEnvironmentVariable(envHome);`

2.0 kullanıyorum ve System.Environment.SpecialFoldervar
snotyak

4

Sonuç olarak cevap Hayır'dır. NET'te Home dizinini almak için basit Sistem tabanlı bir yöntem değildir, öyle ki hem Windows'ta .NET'te hem de Mono'da bir uygulama bekleyebiliriz.

Bazı işletim sistemi algılaması yapmanız ve işletim sistemine özgü koda geçmeniz gerekecektir.


1

Platformlar arası yol dediğinizde, başka hangi işletim sistemlerini desteklemeniz gerekiyor? Windows olmayan bir işletim sisteminde çalıştırıyorsanız, ana dizini bulma yöntemini seçmek için bazı basit işletim sistemi algılaması yapmanız gerekebilir.

Bu web sitesi , Windows'ta ihtiyacınız olanı yapmanız için bir yol sunuyor gibi görünüyor.


Framework Environment.GetFolder () uygulamasının bazı braindead uygulamasını kullanmıyorsanız, platformlar arası çalışmalıdır.
R. Martinho Fernandes

2
Gerekir . MS'nin uygulaması bunu yapmaz.
R. Martinho Fernandes

1

Bu kullanılarak yapılabilir GetEnvironmentVariableiçinde System.IO:

public string GetUserHome() {
    var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE");
    if (!string.IsNullOrWhiteSpace(homeDrive))
    {
        var homePath = Environment.GetEnvironmentVariable("HOMEPATH");
        if (!string.IsNullOrWhiteSpace(homePath))
        {            
            var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath;
            return Path.Combine(fullHomePath, "myFolder");
        }
        else
        {
            throw new Exception("Environment variable error, there is no 'HOMEPATH'");
        }
    }
    else
    {
        throw new Exception("Environment variable error, there is no 'HOMEDRIVE'");
    }
}

Daha sonra pencerelerin altında şunları üretir: C:\\\\Users\\myusername\\myFolder

Kullanırsanız unutmayın

var fullHomePath = Path.Combine(homeDrive.ToString(), homePath.ToString())

başarısız olur çünkü şunları üretir: \\Users\\myusername\\myFolder


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.