2009-09-12 6 views
5

私のアプリケーションのアップデートに取り組んでいます。 .NET 2.0を使用する必要があります。一方の部分は、Vista/Windows 7のデスクトップにファイルを保存する。

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

を使用して、デスクトップ上のファイルを作成します。しかし、私は(私がまだあることをテストしていないのに、私は、仮定している、あまりにもおよびVista)Windows 7でUnauthorizedAccessExceptionを取得します。私は標高を調べました(プログラム全体ではなく、ファイルを作成してその上でアクションを実行する別のアセンブリのために)。しかしそれは.NET 3.0または3.5を必要とするようです。 .NET 2.0を使用してDesktopフォルダにアクセスする方法はありますか? (プログラムを管理者として実行する必要もありません)

(私は検索しましたが、これは私が求めていることに近い唯一の質問です:File creation fails in standard account (Vista)しかし、そして、.NET 2.0固有のものではないので、私は、これは重複)

EDITではないと考えている。
うわー、私は本当にばかされていました。これは実際に正常に動作します。私は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

これは完全なエラー例外を投稿するべきだと思います。 Environment.GetFolderPathは、プログラムを実行している現在のユーザーに対して常に適切なデスクトップを返します。現在のユーザーは、常にデスクトップにフルアクセスしてデスクトップパス上にファイルを作成/削除します。しかし、私は管理者以外のアカウントのためにVista上でこれを行いました。それはうまくいきます.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に示すFileModeを変更したり、例外を処理することもできます。あなたはこのように、これを行うためにPath.Combineを使用することができます2回目の試行ですので、2度目の作成はできません。

+0

かなり愚かな間違いをする。 – NickAldwin

+1

私はOPの問題と同じ問題を抱えていますが、私はあなたのソリューションを使用しましたが、それでも私には同じエラーが表示されます。許可を変更する必要がありますか?私はwindoze 8.1を実行しています – lorddarq

関連する問題