2009-09-12 3 views
5

나는 우리의 응용 프로그램 중 하나를 업데이 트하는 중입니다. .NET 2.0을 사용해야합니다. (나는 아직 테스트하지 않은 비록 내가 있으리라 믿고있어, 너무 비스타) 한 부분은Vista/Windows 7의 데스크톱에 파일 저장 .

FileStream fs = new FileStream(Environment.GetFolderPath 
    (Environment.SpecialFolder.DesktopDirectory), FileMode.Create); 

사용하여 바탕 화면에 파일을 생성하지만 윈도우 7의 UnauthorizedAccessException를 얻을. 나는 고도를 조사했다. (전체 프로그램이 아니라 파일을 생성하고 그에 대한 조치를 취할 별도의 어셈블리를 위해); 그러나 그게 필요합니다 .NET 3.0 또는 3.5. .NET 2.0을 사용하여 Desktop 폴더에 액세스 할 수있는 방법이 있습니까? (관리자로 프로그램을 실행하도록 요구하는 것도 옵션이 아닙니다.)

(나는 검색을 수행했으며, 내가 묻는 질문과 가까운 유일한 질문은 File creation fails in standard account (Vista)이지만 앱 전체를 높이는 것을 의미합니다. 및 .NET 2.0 특정하지, 그래서 나는이 중복)

편집하지 믿습니다 :
와우, 정말 바보되고 있었다. 이것은 실제로 정상적으로 작동합니다. C : \ Users \ MyUser \ Desktop이라는 파일을 만들려고했습니다. 죄송합니다. 혼란을 드려 죄송합니다.

편집 : 여기에 예외의 텍스트는 다음과 같습니다

System.UnauthorizedAccessException was unhandled 
    Message="Access to the path 'C:\\Users\\MyUser\\Desktop' is denied." 
    Source="mscorlib" 
    StackTrace: 
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
     at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) 
     at System.IO.FileStream..ctor(String path, FileMode mode) 
     at MyProgram.Prog.SaveDiagnostic(String filename, String text) in C:\Source\MyProgram\Prog.cs:line 95 
     at MyProgram.Form1.buttonGenDiagnostic_Click(Object sender, EventArgs e) in C:\Source\MyProgram\Form1.cs:line 4729 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at Northwoods.CRM.Import.Form1.Main(String[] args) in I:\WebProspect\Source\Northwoods.CRM.Import\Form1.cs:line 2616 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

나는 전체 오류 추적을위한 완벽한 오류 exception.ToString()을 게시해야한다고 생각합니다. 이것은 관리자 계정에 문제가 없기 때문입니다. Environment.GetFolderPath는 현재 프로그램을 실행중인 현재 사용자의 올바른 바탕 화면을 항상 반환하며 현재 사용자는 항상 바탕 화면에 대한 모든 권한을 가지고 바탕 화면 경로에서 파일을 만들거나 삭제합니다. 그러나 우리는 비 관리자 계정에 대한 비스타에서이 작업을 수행합니다. Windows 7에서는 곧 테스트 할 예정이지만 자세한 스택 추적을 게시 할 것을 주장합니다. –

+0

그것은 현재 사용자에 대한 올바른 데스크탑 폴더를 얻지 만, Win7이 프로그램에서 아무 것도 수정하지 못한다고 생각합니다. 그래도 전체 예외를 게시 할 것입니다. – NickAldwin

+0

@ 닉 :이 아이러니 한 것은 문제를 재현하려고했을 때와 똑같은 예외를 발생 시켰습니다. 코드를 복사하여 붙여 넣지 않았지만 비슷한 것을 작성하고 예외가 발생한 다음 실제 파일 이름을 경로에 추가하여 작동하도록했습니다. 나는 당신의 코드가 똑같은 짓을 한 것을 결코 알지 못했다. 필자는 일반적으로 코드 샘플에 줄 바꿈을 넣어 가로 스크롤 막대를 얻지 않으려 고합니다. 그렇지 않으면 이와 같은 것을 놓치기가 더 쉽습니다. – MusiGenesis

답변

14

문제는이 코드에

FileStream fs = new FileStream(Environment.GetFolderPath 
    (Environment.SpecialFolder.DesktopDirectory), FileMode.Create); 

의이 실제로 발생 단계에 그것을 다시 보자

var desktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); 
var fs = new FileStream(desktopFolder, FileMode.Create); 

여기에서하려는 것은 데스크톱에 파일을 만들지 않으려 고 시도하는 것입니다. 자체 데스크톱 폴더를 만들려면. 바탕 화면 폴더가 이미 있으므로 오류가 발생합니다.

데스크탑 폴더 안에 파일을 생성하면됩니다.

var desktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); 
var fullFileName = Path.Combine(desktopFolder, "Test.txt"); 
var fs = new FileStream(fullFileName, FileMode.Create); 

당신은 또한 OpenOrCreate에 파일 모드를 변경하거나 예외를 처리 할 수 ​​있습니다 - 예를 들어 코드가 두 번 실행하는 경우, 파일이 이미 존재합니다 :이처럼이 일을 Path.Combine을 사용할 수 있습니다 두 번째 시도, 그래서 당신은 그것을 두 번째로 만들 수 없을 것입니다.

+0

꽤 바보 같은 실수를 저 지르게됩니다. – NickAldwin

+1

나는 OP와 같은 문제를 겪고있다. 그러나 나는 당신의 솔루션을 사용했고 여전히 나에게 같은 오류를 준다. 허가를 변경해야합니까? 나는 바람이 불고있는 8.1을 달리고있다. – lorddarq