2017-09-13 4 views
1

enter image description here 무엇이 잘못 되었나요?액세스가 거부되었습니다!? C 드라이브의 설치 폴더에서 파일을 열 수 없음

소프트웨어와 함께 설치된 폴더에 액세스하는 읽기/복사/쓰기 프로세스가 있습니다.

이것은 빌드를 테스트 할 때 매우 효과적 이었지만 일단 솔루션이 생성되면 완전히 작동을 멈췄습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

(코드의 고장) 나는 기본적으로 CTW.pdf 다음으로 우리가 소프트웨어를 채우고 완료에 반음 내린 임시 복사본을 만들라고하는 PDF 액세스 소프트웨어는 새와 같은 디렉토리에 새 복사본을 저장

if (screenLock.Text == "") 
{ 

} 
else 
{ 
    string fileNameExisting = @"C:\Program Files (x86)\Compliance Pro 2\CTW.pdf"; 
    string fileNameNew = @"C:\Program Files (x86)\Compliance Pro 2" + " CTW.pdf" + DateTime.Now.ToString("M/d/yyyy") + DateTime.Now.ToString("hh:mm:ss"); 

    using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open)) 
    using (var newFileStream = new FileStream(fileNameNew, FileMode.Create)) 
    { 
     // https://www.codeproject.com/Tips/679606/Filling-PDF-Form-using-iText-PDF-Library 
     // Open existing PDF 
     var pdfReader = new PdfReader(existingFileStream); 
     // PdfStamper, which will create 
     var stamper = new PdfStamper(pdfReader, newFileStream); 
     var form = stamper.AcroFields; 
     var fieldKeys = form.Fields.Keys; 
     foreach (string fieldKey in fieldKeys) 
     { 
      form.SetField(fieldKey, ""); 
     } 
     stamper.AcroFields.SetField("OSJNonOSJ", "TFSN"); 
     stamper.AcroFields.SetField("Branch", "9DCF"); 
     stamper.AcroFields.SetField("User Name Last First", "Joe" + "Pearson"); 
     stamper.AcroFields.SetField("Tested by Last First", emailTo.Text); 
     stamper.AcroFields.SetField("Date Tested", DateTime.Now.ToString("M/d/yyyy")); 
     stamper.AcroFields.SetField("COMMENTS", notes.Text); 
     stamper.AcroFields.SetField("WDE-Yes", user.Text + "5"); 
    } 
} 

참고 : 이름 여기

(내가 단순히 파일 이름에 시간과 날짜를 추가하는) 코드의 나는 그것이 기능의 전체에 대한 관리 액세스 권한을 필요로하지 않습니다 내 소프트웨어를 보장하기 위해 정말 열심히 일했다 , 나는 그것을 여기에서 피하고 싶습니다. 게다가.

+0

참조 용 이미지를 추가했습니다. –

+1

일반적으로 C : \ 드라이브에는 쓰기 권한이 필요합니다. 그리고 아마 그것이 AccessDenied 에러를 얻는 이유 일 것입니다. – Sach

+0

클리너 솔루션이 있습니까? 간단히이 PDF를 가져 와서 덮어 쓰고 다른 곳에 저장하기를 원합니다. (저장 위치는 상관 없습니다. 사용자 정의도 가능합니다) –

답변

2

파일을 C : \에 직접 넣거나 다시 쓰기를 시도해도 좋지 않습니다. 실제로 Windows 드라이브의 모든 관련 폴더가 보호되므로 쓰기 작업을 수행하려면 최소한 관리 권한이 필요합니다. 그것들이 없으면 programm 디렉토리에 쓰기 권한을 부여 할 수 없습니다 (그리고 할 수 있더라도 실제로는 거기에 데이터를 놓으면 안됩니다).

데이터를 쓰고 저장할 수있는 장소가 필요하면 SpecialFolders을 찾으십시오. 특히 Userprofile 특정 폴더는 일반 사용자로 액세스 할 수 있도록 설계되었습니다. 데이터가 사용자간에 공유되는 경우 게시자를 사용하고, 그렇지 않은 경우 프로필을 사용하십시오.

+1

'% ProgramFiles (x86) %'에있는 파일에서 * 읽은 *은 어떨까요? –

+0

소프트웨어 디렉토리를 호스팅하는 데 가장 적합한 위치가 있습니까? 어쩌면 당신은 당신이 가진 성공한 폴더를 가지고 있을까요? –

+0

Virtualsiation (http://www.thecodeking.co.uk/2007/03/making-your-application-uac-aware.html)에 부딪혔을 수 있습니다. 처음부터 그 폴더에 액세스하려고했기 때문에 실제로는 아무 것도 가능하지 않습니다. 설치 프로그램을 제외하고는 절대로 시도해서는 안됩니다. 이 파일을 사용자에게 속한 SpecialFolders에 넣기 만하면 액세스 할 수있는 문제는 0 개입니다. 문제가 생기면 그것은 관리 문제입니다. – Christopher

1

오류가있는 줄은 기존 파일을 읽는 중입니다.

보호 된 위치에서 읽는 중이지만 데이터를 읽기만하기 때문에 지정 오류가 발생합니다. 권한 상승이 필요한 파일을 잠그려고합니다.

읽기 작업을위한 회선을 FileAccess.Read으로 변경하십시오. 그 장애물을 분명히해야합니다.
로컬 콘솔 앱을 만들고 관리자 권한으로 실행하지 않을 때도 이와 같은 오류가 발생합니다. 그러나 아래 코드를 추가하면 잘 작동합니다.

using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open, FileAccess.Read)) 

그럼 당신은 최고의 다른 사람에 의해 언급 한 이유로 모든 Program Files에서 수행해서는 안 파일을 작성하는 방법을 결정해야합니다.

+0

좋은 지점이지만, 나는 OP가 ** 쓰기 **의 목적으로 두 번째 파일을 열려고 시도하는 다음 줄에서 실패 할 것이라고 의심합니다 ** – MickyD

+0

[docs] (https : //msdn.microsoft.com/ko-kr/library/47ek66wy) 파일 잠금에 대해 알아보십시오. 그러나'access' 매개 변수가없는 생성자는 기본적으로'ReadWrite' 액세스로 명시되어 있습니다. 보안 설명자가 응용 프로그램의 설치 관리자에 의해 설정되지 않은 경우 관리자 로그온이 필요합니다. – eryksun