2012-12-18 3 views
4

VS2008 설치 프로젝트를 사용하여 .msi를 만들었습니다. 내 응용 프로그램은 응용 프로그램 디렉토리 (C : \ Program Files \ MyApp \ MyFile.txt)의 .txt 파일에 값을 자주 씁니다. Win7에서 insalling 후, 그것은 "경로 ....에 대한 액세스가 거부되었습니다."라는 예외를 발생시킵니다.경로 ....에 대한 액세스가 거부되었습니다.

하지만 관리자 권한으로 실행할 때마다 예외가 발생하지 않습니다. 여기 내거야 sscce

string FilePath=Application.StartupPath + @"\AppSettings\CurrentUserName.inf"; 
using (StreamWriter writer=new StreamWriter(FilePath,false)) 
{ 
    writer.Write(txtLoginName.Text.Trim()); 
} 
MainForm.ProcessLogIn(); 
this.DialogResult = DialogResult.OK; 

나는이 문제를 해결하는 방법을 모른다. 어떠한 제안?

+0

여기에 코드를 게시하십시오 – VladL

+1

수동으로 파일의 사용 권한을 확인하고 파일을 작성할 때 현재 사용 자에게 해당 파일에 대한 쓰기 권한이 있는지 확인하십시오. – pylover

+0

게시물에 서명을 포함 할 필요가 없습니다. 사용자 카드가 자동으로 추가됩니다. 자세한 내용은 [FAQ] (http://stackoverflow.com/faq#signatures)를 참조하십시오. – Artemix

답변

5

이 문제를 해결하는 유일한 방법은 해당 폴더에 쓰지 않는 것입니다. 규칙에 따라 해당 폴더에 쓸 수있는 권한이 없습니다. 불행히도 이전 버전의 Windows에서는이 작업을 수행하지 않았습니다. 보도에 운전을 중지하고를 사용해야 할

// your application data for just that User running the app 
var perUserAppData = Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData); 

// your application data for ALL users running the app 
var allUsersAppData = Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData); 

// better! 
var path = Path.Combine(perUserAppData, @"MyApp\MyFile.txt"); 

기본적으로 윈도우 7 당신이려고하고 있음을 말하고있다 :

대신에, 당신은 당신이 갈 필요가 어디에서 찾을 당신을 도와 Environment.SpecialFolder을 사용할 수 있습니다 거리 의도대로.

+0

좋은 협조에 감사드립니다. 그러나 여기에 약간의 문제가 있습니다. Path.Combine()은 3 가지 인수를 취하지 않습니다. 이 파일은 이어야합니다. var path = Path.Combine (perUserAppData, "MyApp \\ MyFile.txt"); –

+1

[아마도 분명히] (http://msdn.microsoft.com/en-us/library/dd784047.aspx) 아마도 .Net 버전에는 없을 것입니다. – user7116

+0

yeap, 알겠습니다. –

8

파일을 Program Files 디렉터리에서 옮깁니다. Win7에서는 일반 사용자를 위해 읽기 전용입니다.

ProgramData 디렉터리에서 파일을 이동할 수 있습니다.
설치 프로그램에서 해당 응용 프로그램의 디렉토리를 만들어야합니다.
그런 다음 코드 내부에이

c:\programdata\MyAppDir\MyFile.txt 

같은 경로 (Win7에에)

string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 
string appFile = Path.Combine(dataPath, "MyAppDir", "MyFile.txt"); 

일반적으로이 결과를 코드 줄을 사용하지만 SpecialFolder 열거를 사용하여 올바른 전체 경로 이름을 검색 할 수 있습니다 현재 운영 체제에 의존하지 않고 응용 프로그램에 대한 readwrite에서 사용 가능한 폴더를 사용하도록 보장됩니다.

+0

정말 고마워요. – Ni3

0

단기적인 수정 프로그램으로 ICACLS를 사용하여 파일에 대한 쓰기 권한을 부여 할 수 있습니다. 참고 : 전체 디렉토리가 아닙니다.

장기간에 걸친 수정 프로그램으로 권한이없는 사용자로 실행하는 경우 프로그램 디렉토리에 쓰지 말고 대신 % LOCALAPPDATA % 또는 % APPDATA %와 같은 위치에 작성해야합니다.

관련 문제