2009-09-12 20 views
5

Tôi đang làm việc để cập nhật một trong các ứng dụng của chúng tôi. Nó phải sử dụng .NET 2.0. Một phần tạo tệp trên Desktop bằng cách sử dụngLưu tệp vào máy tính để bàn trong Vista/Windows 7 trong .NET 2.0

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

Nhưng tôi cũng nhận được UnauthorizedAccessException trong Windows 7 (và Vista, mặc dù tôi chưa thử nghiệm). Tôi nhìn vào độ cao (không phải cho toàn bộ chương trình, nhưng đối với một hội đồng riêng biệt mà sẽ tạo ra các tập tin và thực hiện các hành động trên nó); tuy nhiên điều đó dường như yêu cầu .NET 3.0 hoặc 3.5. Có cách nào để truy cập vào thư mục Desktop bằng .NET 2.0 không? (Yêu cầu chương trình chạy với tư cách Quản trị viên cũng không phải là tùy chọn)

(Tôi đã thực hiện tìm kiếm và câu hỏi duy nhất gần với những gì tôi hỏi là: File creation fails in standard account (Vista) tuy nhiên nó đang nói về việc nâng cao toàn bộ ứng dụng và không phải là .NET 2.0 cụ thể, vì vậy tôi tin rằng đây không phải là một bản sao)

EDIT:
Wow, tôi đã được thực sự câm. Điều này thực sự hoạt động tốt. Tôi đã cố tạo một tệp có tên C: \ Users \ MyUser \ Desktop. Rất tiếc. Xin lỗi vì sự nhầm lẫn.

EDIT: Dưới đây là nội dung của ngoại lệ:

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

Tôi nghĩ bạn nên đăng ngoại lệ lỗi hoàn chỉnh.ToString() với dấu vết đầy đủ, vì vấn đề này không có vấn đề với tài khoản quản trị viên hay không. Environment.GetFolderPath sẽ luôn trả về đúng desktop cho người dùng hiện tại đang chạy chương trình và người dùng hiện tại luôn có quyền truy cập đầy đủ vào desktop để tạo/xóa file trên đường dẫn desktop. Tuy nhiên chúng tôi đã làm điều này trên vista cho tài khoản không quản trị và nó không hoạt động, cho Windows 7 tôi sẽ được thử nghiệm ra sớm, nhưng tôi vẫn nhấn mạnh bạn đăng bài theo dõi ngăn xếp chi tiết. –

+0

Nó nhận được thư mục máy tính để bàn chính xác cho người dùng hiện tại, nhưng tôi đoán Win7 không cho phép các chương trình sửa đổi bất kỳ thứ gì ở đó. Tuy nhiên, tôi vẫn sẽ đăng ngoại lệ đầy đủ. – NickAldwin

+0

@Nick: sự trớ trêu của điều này là, tôi đã tạo ra cùng một ngoại lệ chính xác khi tôi cố gắng tái tạo sự cố của bạn. Tôi đã không sao chép và dán mã của bạn, nhưng tôi đã viết một cái gì đó tương tự và có ngoại lệ, và sau đó thay đổi nó bằng cách thêm một tên tệp thực tế vào đường dẫn để làm cho nó hoạt động. Tôi không bao giờ nhận thấy rằng mã của bạn đã làm điều tương tự. Tôi thường cố gắng để đặt một ngắt dòng trong các mẫu mã của tôi để tôi không nhận được thanh cuộn ngang - nếu không nó dễ dàng hơn để bỏ lỡ những thứ như thế này. – MusiGenesis

Trả lời

14

Vấn đề là trong mã này

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

Hãy viết lại nó thành các bước mà thực sự sẽ xảy ra

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

Những gì bạn đang cố gắng làm ở đây không phải là tạo tệp trên màn hình, bạn đang cố gắng tạo thư mục dành cho máy tính để bàn. Thư mục máy tính để bàn rõ ràng đã tồn tại, do đó bạn gặp lỗi.

Những gì bạn cần làm là tạo một tệp bên trong thư mục trên máy tính để bàn. Bạn có thể sử dụng Path.Combine để làm điều này, như thế này:

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

Bạn cũng có thể muốn thay đổi chế độ File để OpenOrCreate, hoặc xử lý ngoại lệ của bạn - nếu ví dụ mã chạy gấp đôi, và các tập tin sẽ đã tồn tại trên thứ hai cố gắng, vì vậy bạn sẽ không thể tạo nó lần thứ hai

+0

Hoàn toàn sai lầm ngớ ngẩn. – NickAldwin

+1

Tôi đang gặp vấn đề tương tự OP, nhưng tôi đã sử dụng giải pháp của bạn và nó vẫn cho tôi lỗi tương tự. Tôi có thể cần phải thay đổi sự cho phép? Tôi đang chạy windoze 8.1 – lorddarq

Các vấn đề liên quan