C #에서 홈 디렉토리의 경로를 얻습니까?


101

좋아, Environment.SpecialFolder를 확인했지만 여기에는 아무것도 없습니다.

C #에서 현재 사용자의 홈 디렉터리를 얻고 싶습니다. (예 c:\documents and settings\user: XP, c:\users\userVista, /home/userUnix)

나는 이것을 찾기 위해 환경 변수를 읽을 수 있다는 것을 알고 있지만 크로스 플랫폼 방식으로 이것을하고 싶습니다.

.NET (가급적이면 mscorlib 사용)으로이 작업을 수행 할 수있는 방법이 있습니까?

업데이트 : 좋아, 이것은 내가 사용한 코드입니다.

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

2
팔. 서쪽에서 가장 빠른 총 : P
Boris Callens

컴퓨터에 대한,하지만 HOMEPATH %의 %% 내 XP 상자 %의 HOMEDRIVE에 몰라하지 C, A 네트워크 디렉토리입니다 : \ 문서 및 설정 \ 사용자 \ MSalters \
MSalters

솔직히 말해서이 정확한 문제는 .NET의 과소 구현이라고 생각합니다 ... CSIDLS ( msdn.microsoft.com/en-us/library/bb762494.aspx )에 대한 설명서에서 전체 목록을 확인해야합니다. Windows에서 지원하는 것 : 실제로 찾고있는 것은 CSIDL_PROFILE로, Windows에서는 지원되지만 .NET에서는 지원되지 않습니다.
Matthew Scharley

1
다음 번에 결과를 답에 넣어야한다고 생각합니다.
Peteter

PlatformID.MacOSX는 필요하지 않으며, PlatformID.Unix는 MacOSX에서도 true를 반환합니다 (또는 최소한 예전처럼).
Stefan Steiger 2015 년

답변:


51

Environment.SpecialFolder.Personal실제로 홈 폴더를 반환하지 않고 내 문서 폴더를 반환 합니다. Win32에서 홈 폴더를 얻는 가장 안전한 방법은 %HOMEDRIVE%%HOMEPATH%. 환경 변수를 읽기 포스터 싶어 왜 확실하지 않다, 그래서 실제로 (유닉스와 윈도우를 통해) 할 매우 휴대용 하지 를 않습니다.

추가 편집 : 크로스 플랫폼 (Windows / Unix) C #의 경우 $HOMEUnix 및 OSX 및 %HOMEDRIVE%%HOMEPATH%Windows에서 읽었습니다 .


나는 사실 HOMEDRIVE가 * nix에 존재하지 않으며 일반적으로 HOMEPATH가 아니라 HOME입니다.
Matthew Scharley

매튜, 당신 말이 맞아요. 원래 댓글에 대한 설명을 추가했습니다.
sigint

12
Windows에서 % USERPROFILE %을 사용할 수 없습니까?
Lucas Jones

1
$ HOME은 OS X에서도 작동합니다. 플랫폼 감지를 수행하고 있기 때문에 이것은 여전히 ​​정답이 아니지만 ... 요청한 정확한 값을 얻으려면해야 할 일입니다.
Matthew Scharley

2
person-b, % USERPROFILE % 및 % HOMEDRIVE %% HOMEPATH %는 종종 개인용 PC에서 동일하지만 종종 네트워크 환경에서 다른 위치를 가리 킵니다. 예를 들어 직장에서 내 USERPROFILE은 C : \ Documents and Settings \ username이지만 홈 디렉토리는 IT에서 정기적으로 백업하는 네트워크 드라이브 인 Z : \입니다.
sigint

92
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

개인은 내 문서 (또는 win7 이상의 문서)입니다.


8
UserProfile은 .NET 4.0의 새로운 기능입니다. .NET 2.0 / 3.5를 사용하는 경우 UserProfile에 대해 값 40으로 win32 API를 수동으로 호출해야합니다
linquize

그리고 "내 문서"는 Windows 95, 98 및 ME를 제외하고는 홈 디렉토리와 동일하지 않습니다.
Jon Hanna

1
이식성을 유지하려면 System.IO.Path.DirectorySeparatorChar를 사용하여 파일 경로를 작성하는 것을 잊지 마십시오.
thomiel

4
DirectorySeperatorChar를 수동으로 사용하지 마십시오. Path.Combine을 사용하십시오.
John Gietzen 2015 년

14

나는 당신이 찾고있는 것이 있다고 믿습니다.

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

참고로 mscorlib.


그러면 내 문서 폴더가 반환됩니다.
MiffTheFox

"내 문서" Windows가 홈 디렉토리에 가장 가까운 것입니다.
MSalters

8
@MStallers 아니요, % HOMEDRIVE %% HOMEPATH %입니다.
MiffTheFox

정답은 아니지만 대안은 PInvoke이며 OP는 관리 솔루션을 요청했습니다.
Matthew Scharley

7
참고 Environment.SpecialFolder.UserProfile 당신이 원하는 것입니다 .NET 4.0에서 사용할 수 있음
linquize

8

DotNetCore 1.1 System.Environment.SpecialFolder에는 존재하지 않습니다. 2.0 베타에 존재할 수 있습니다. 그때까지 이렇게하려면 다음을 사용할 수 있습니다.

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

나는 2.0을 사용하고있어 System.Environment.SpecialFolder존재
snotyak

4

결론은 아니오입니다. Windows와 Mono 모두에서 .NET 구현을 기대할 수있는 홈 디렉토리를 가져 오는 .NET의 단순한 시스템 기반 방법이 아닙니다.

일부 OS 감지를 수행하고 OS 특정 코드로 분기해야합니다.


1

크로스 플랫폼 방식이라고 할 때 지원해야하는 다른 OS는 무엇입니까? Windows가 아닌 OS에서 실행중인 경우 홈 디렉토리를 찾는 방법을 선택하려면 몇 가지 간단한 OS 감지를 수행해야 할 수 있습니다.

이 웹 사이트 는 Windows에서 필요한 작업을 수행하는 방법을 제공하는 것 같습니다.


Framework Environment.GetFolder ()의 일부 브레인 데드 구현을 사용하지 않는 한 크로스 플랫폼에서 작동해야합니다.
R. Martinho Fernandes

2
해야 합니다. MS의 구현은 그것을하지 않습니다.
R. Martinho Fernandes

1

GetEnvironmentVariablein을 사용하여 수행 할 수 있습니다 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'");
    }
}

그런 다음 창 아래에 생성됩니다. C:\\\\Users\\myusername\\myFolder

사용하는 경우

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

다음을 생성하기 때문에 실패합니다. \\Users\\myusername\\myFolder


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.