C #이 % AppData %의 경로를 얻는 중


387

C # 2008 SP1

아래 코드를 사용하고 있습니다 :

dt.ReadXml("%AppData%\\DateLinks.xml");

그러나 응용 프로그램이 실행되는 위치를 가리키는 예외가 발생합니다.

경로 'D : \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \ % AppData % \ DateLinks.xml'의 일부를 찾을 수 없습니다.

%AppData%상대 경로를 찾아야 한다고 생각했습니다 . Start|Run|%AppData%Windows 탐색기 로 이동하면 해당 디렉토리로 이동합니다.

각 클라이언트 컴퓨터에서 사용자가 다르기 때문에 전체 경로를 넣을 수 없습니다.

답변:


802

AppData 디렉토리 를 가져 오려면 다음 GetFolderPath방법 을 사용하는 것이 가장 좋습니다 .

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

( using System없는 경우 추가해야 함 ).

%AppData%는 환경 변수이며 .NET의 어느 곳에서나 자동으로 확장되지 않지만 Environment.ExpandEnvironmentVariable메서드를 명시 적으로 사용할 수는 있습니다 . GetFolderPath그러나 Johannes Rössel이 의견에서 지적했듯이 %AppData%특정 상황에서는 설정되지 않을 수 있기 때문에 여전히 사용하는 것이 좋습니다 .

마지막으로 예제와 같이 경로를 만들려면

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
환경에 의존하지 않고 실제 솔루션을 제공하는 +1 대답에 추가하려면 : 파일 이름을 처리하는 모든 함수가 환경 변수를 확장하지는 않습니다. 실제로 일반적으로 명시 적으로이 작업을 수행해야합니다. 그렇지 않으면 작동하지 않으며 % something % 폴더가 생깁니다. 또한 환경이 없어도됩니다. 경우에 따라 다른 사용자 계정으로 프로그램을 실행할 때 사용자 환경이로드되지 않고 % Appdata %가 비어 있습니다. 따라서 배치 파일을 사용하지 않는 한 문서화 된 API를 사용하여 해당 폴더를 가져 오는 것이 좋습니다.
Joey

@Johannes : 좋은 정보가 있습니다. 방금 게시 한대로 내 대답을 수정했지만 GetFolderPath가 ExpandEnvironmentVariable보다 확실히 선호된다는 것을 분명히 알 수 있습니다.
Noldorin

Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData)의 경우 +1, 며칠 동안이 문제가 발생했습니다.
고쉬 서밋

1
어떤 이유로 든 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)빈 문자열을 반환합니다 (IIS 7, VS 2011). 를 사용하여 Simon_Weaver 솔루션 매핑을 사용하여 문제가 해결되었습니다 MapPath.
Mike Keskinov

52
참고로 로컬 AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)에 대한 로밍 디렉토리를 제공합니다
roundcrisis

49

ASP.NET을 사용하는 경우 경로가 다릅니다.

ASP.NET의 / App_Data를 가리키는 'SpecialFolder'값을 찾을 수 없습니다.

대신이 작업을 수행해야합니다.

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(참고 : MVC 컨트롤러에는 '현재'속성이 필요하지 않습니다.)

또 다른 '추상적 인'방법이 있다면 App_Data어떻게 듣는지 좋아할 것입니다.


asp.net 코어가 나올 때부터 참고하십시오. 이 방법은 특히 IIS에 의존합니다.
George Mauer

7
HostingEnvironment.MapPath(@"~/App_Data")하지만 확인의 핵심에 대해 - 더으로 HttpContext이없는 경우 더 나은 작품 모두 MVC / WebAPI 및 WCF 상황에서입니다
Simon_Weaver

36

BEST 의 AppData 디렉토리를 사용하는 방법은, IS 사용하는 Environment.ExpandEnvironmentVariable방법.

원인:

  • 문자열의 일부를 유효한 디렉토리 또는 다른 것으로 바꿉니다.
  • 대소 문자를 구분하지 않습니다
  • 쉽고 간단합니다
  • 그것은 표준입니다
  • 사용자 입력 처리에 적합

예 :

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

일부 사용자는 %AppData%, 일부 %appdata%및 일부는 기억하고 %APpData% 싶지 않습니다.

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

환경 변수가 설정되어 있지 않은 경우 ( IS 이외의 경우) 결함이 아닙니다 . 나는 보통 사람들을 말하지 마 하지 내가 먼저 다른 길을 가서는 나쁜 생각 이었다는 것을 깨달았다 - 재 발명 바퀴를하지만 후.


path변수 의 예를 좋아했습니다 :)
RBT

Environment.ExpandEnvironmentVariable경로 문자열에 어떤 환경 변수가 있는지에 관계없이 단순히 확장해야 할 때 +1 이 가장 좋습니다.
blins

24

당신은 또한 사용할 수 있습니다

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

%AppData%변수 를 확장합니다 .


15

.net2.0에서는 변수를 사용할 수 있습니다 Application.UserAppDataPath


20
이것은 Winforms 전용입니다.

7

% AppData %를 문자열에 넣는 것은 효과가 없다고 생각합니다.

시험

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

누군가가 이것을 필요로하는 경우 내 mvc 응용 프로그램의 'App_Data'폴더에 액세스하는 다른 방법을 공유하고 싶었습니다.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

정답이 아닐 수도 있지만 그것이 내가 찾던 것입니다. +1
Derrick

작은 따옴표를 큰 따옴표로 바꾼 후 나를 위해 일했습니다. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d

1

이것은 콘솔 응용 프로그램에서 나를 위해 일하고 있습니다.

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

ASP.NET의 Load User Profile경우 앱 풀 에서 설정을 설정해야하지만 충분하지 않습니다. 에 숨겨진 설정이 setProfileEnvironment있으며 \Windows\System32\inetsrv\Config\applicationHost.config, 설명서에 설명 된대로 어떤 이유로 든 기본적으로 해제되어 있습니다 . 기본값을 변경하거나 앱 풀에서 기본값을 설정할 수 있습니다. Environment클래스의 모든 메소드는 적절한 값을 리턴합니다.

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