Enregistrer le fichier sur le bureau sous Vista / Windows 7 dans .NET 2.0

Je travaille sur la mise à jour de l’une de nos applications. Il doit utiliser .NET 2.0. Une partie crée un fichier sur le bureau en utilisant

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

Mais je reçois une exception UnauthorizedAccessException sous Windows 7 (et Vista aussi, je suppose, bien que je ne l’aie pas encore testée). J’ai examiné l’élévation (pas pour l’ensemble du programme, mais pour un ensemble séparé qui créerait le fichier et effectuerait des actions dessus); cependant, cela semble nécessiter .NET 3.0 ou 3.5. Existe-t-il un moyen d’accéder au dossier Bureau à l’aide de .NET 2.0? (Exiger que le programme soit exécuté en tant qu’administrateur n’est également pas une option.)

(J’ai effectué une recherche et la seule question proche de ce que je vous pose est la suivante: la création de fichier échoue dans un compte standard (Vista); toutefois, il est question d’élever l’ensemble de l’application et n’est pas spécifique à .NET 2.0. n’est pas un doublon)

MODIFIER:
Wow, j’étais vraiment stupide. Cela fonctionne vraiment bien. J’essayais de créer un fichier appelé C: \ Users \ MyUser \ Desktop. Oops. Désolé pour la confusion.

EDIT: Voici le texte de l’exception:

  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, Ssortingng maybeFullPath) at System.IO.FileStream.Init(Ssortingng path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, Ssortingng msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(Ssortingng path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, Ssortingng msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(Ssortingng path, FileMode mode) at MyProgram.Prog.SaveDiagnostic(Ssortingng filename, Ssortingng 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(Ssortingng[] args) in I:\WebProspect\Source\Northwoods.CRM.Import\Form1.cs:line 2616 at System.AppDomain._nExecuteAssembly(Assembly assembly, Ssortingng[] args) at System.AppDomain.ExecuteAssembly(Ssortingng assemblyFile, Evidence assemblySecurity, Ssortingng[] 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: 

Le problème est dans ce code

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

Réécrivons-le dans les étapes qui vont réellement se passer

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

Ce que vous essayez de faire ici n’est pas de créer un fichier sur le bureau, mais de créer le dossier du bureau lui-même . De toute évidence, le dossier du bureau existe déjà, vous obtenez donc une erreur.

Ce que vous devez faire est de créer un fichier dans le dossier du bureau. Vous pouvez utiliser Path.Combine pour faire ceci, comme ceci:

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

Vous pouvez également vouloir changer le FileMode en OpenOrCreate ou gérer vos exceptions – si par exemple le code est exécuté deux fois et que le fichier existe déjà à la deuxième tentative, vous ne pourrez donc pas le créer une seconde fois