2009-07-17 4 views
76

좋아요, Environment.SpecialFolder를 확인했습니다.하지만 여기에는 아무 것도 없습니다.C#에서 홈 디렉토리의 경로를 가져 오는 중입니까?

C#에서 현재 사용자의 홈 디렉토리를 가져오고 싶습니다. (유닉스에서 예를 들어, XP에서 c:\documents and settings\user, 비스타에서 c:\users\user/home/user.)

나는이를 찾기 위해 환경 변수를 읽을 수 알지만, 크로스 플랫폼 방식으로이 작업을 수행 할 수 있습니다.

.NET에서이 작업을 수행 할 수있는 방법이 있습니까 (mscorlib를 사용하는 것이 좋음)?

UPDATE가 :

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

붐. 서쪽에서 가장 빠른 총 : P –

+0

컴퓨터에 대한 Dunno가 내 XP 상자에서 % HOMEDRIVE %% HOMEPATH %는 네트워크 디렉토리가 아니라 c : \ Documents and Settings \ user \ MSalters \ – MSalters

+0

입니다. 문제는. NET의 underimplementation 수 ... 당신은 CSIDLS (http://msdn.microsoft.com/en-us/library/bb762494.aspx)에 대한 설명서를 보면 Windows가 지원하는 전체 목록을 볼 수 있습니다. 실제로 찾고있는 것은 CSIDL_PROFILE이며, Windows에서는 지원되지만 .NET으로는 지원할 수없는 이유가 있습니다. –

답변

40

Environment.SpecialFolder.Personal 실제로 홈 폴더를 반환하지 않으면 내 문서 폴더를 반환합니다. Win32에서 홈 폴더를 얻는 가장 안전한 방법은 %HOMEDRIVE%%HOMEPATH%입니다. 환경 변수를 읽는 것은 사실 매우 (Unix와 Windows에서) 수행하기 쉽기 때문에 포스터가 왜 이 아닌지 잘 모르겠습니다. 않습니다. 추가 편집

: 크로스 플랫폼 (윈도우/유닉스) C 번호, 나는 윈도우에서 유닉스와 OSX에 $HOME%HOMEDRIVE%%HOMEPATH%을 읽을 것입니다.

+0

나는 HOMEDRIVE가 * nix에 존재하지 않는다는 것을 알고 있으며, 보통 HOMEPATH가 아니라 단지 HOME 일뿐입니다. –

+0

Matthew, 네 말이 맞아. 원래의 설명에 대한 설명을 추가했습니다. – sigint

+0

+1 동의, 이것은 우리가 얻을 수있는 가장 가까운 것입니다. – AnthonyWJones

9

내가 당신을 위해 무엇을 찾고있는 것은 생각 : 좋아, 이것이 내가 사용하여 종료 코드입니다 참고로

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

, 그것은에 포함 가리키고이다 mscorlib.

+0

내 문서 폴더를 반환합니다. – MiffTheFox

+0

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

+6

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

0

크로스 플랫폼 방식이라고 할 때, 어떤 다른 OS를 지원해야합니까? 비 Windows OS에서 실행중인 경우 홈 디렉토리 찾기 방법을 선택하기 위해 간단한 OS 검색을해야 할 수도 있습니다.

This website Windows에서 필요한 것을 수행하는 방법을 제공하는 것 같습니다.

+0

Framework Environment.GetFolder()가 여러 플랫폼에서 작동해야하는 경우가 아니면 사용하지 않는 것이 좋습니다. –

+2

*해야합니다. MS의 구현은 그렇게하지 않습니다. –

0

테스트 할 기계가 없지만 %HOMESHARE%이 도움이 될 수 있습니다. 그렇지 않으면 여기에 꽤 좋은 list of environment variables입니다.

3

최종 답변은 아니오입니다. Windows에서 .NET과 Mono 모두에서 구현을 기대할 수 있도록 홈 디렉토리를 얻으려면 .NET에서 간단한 시스템 기반 방법이 아닙니다.

일부 OS 감지 및 OS 특정 코드로 분기해야합니다.

65
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 

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

+8

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

+0

"내 문서"는 다음을 제외하고 홈 디렉토리와 다릅니다. Windows 95, 98 및 ME. –

+1

System.IO.Path.DirectorySeparatorChar을 사용하여 이식성을 유지하기 위해 파일 경로를 빌드하는 것을 잊지 마십시오. – thomiel

0

제안 : \\Users\\myusername\\myFolder

4

을 DotNetCore 1.1 : 당신이

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

를 사용하는 경우는 발생 원인이 실패 C:\\\\Users\\myusername\\myFolder

참고 : 다음 그것은 창에서 생산

using System.IO; 
var homeDrive = Environment.GetEnvironmentVariable("HOMEDRIVE"); 
if (homeDrive != null) 
{ 
    var homePath = Environment.GetEnvironmentVariable("HOMEPATH"); 
    if (homePath != null) 
    {    
    var fullHomePath = homeDrive + Path.DirectorySeparatorChar + homePath; 
    FolderPath = 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'"); 
} 

System.Environment.SpecialFolder은 exi가 아닙니다. 성. 2.0 베타에 존재할 수도 있습니다. 그 때까지 다음을 사용할 수 있습니다.

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

2.0을 사용 중이며'System.Environment.SpecialFolder'가 있습니다. – snotyak

관련 문제