2010-03-02 23 views
15

Tôi cài đặt ứng dụng của mình trong thư mục "Program Files". Và tôi cài đặt dữ liệu, dưới "ProgramData" thư mục:Viết trong thư mục "ProgramData" (W7 và Vista) .NET

Environment.SpecialFolder.CommonApplicationData

Trong ProgramData Tôi đã tạo ra thư mục để lưu dữ liệu. Ví dụ:

C: \ ProgramData \ MyApp \ MyData \ ở đây tôi có các file và thư mục

Dưới XP tất cả chạy tốt. Nhưng không phải dưới hệ điều hành Vista hoặc W7.

Tôi có thể đọc tệp trong thư mục này, nhưng tôi không thể ghi tệp, tôi không thể tạo tệp mới, v.v. Người dùng được đăng nhập dưới dạng Quản trị viên.

Tôi có thể lưu trữ dữ liệu mà không bị hạn chế ở đâu? Tôi cần lưu trữ dữ liệu trong một thư mục rõ ràng cho tất cả người dùng

EDITED:

tôi có mã này trong file app.manifest tôi:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <!-- Opciones del manifiesto de Control de cuentas de usuario 
      Si desea cambiar el nivel de Control de cuentas de usuario de Windows, reemplace el 
      nodo requestedExecutionLevel por alguno de los siguientes. 

     <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 

      Si desea utilizar la virtualización de archivos y del Registro para la compatibilidad 
      con versiones anteriores, elimine el nodo requestedExecutionLevel. 
     --> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</asmv1:assembly> 
+0

Bài liên quan: http://stackoverflow.com/questions/1191941/c-file-write-permission-issue-under-program-files-folder –

Trả lời

4

Đây là một điều UAC. Bạn có chương trình chạy với tư cách quản trị viên để tạo/xóa các tệp/thư mục trong SpecialFolder này.

+0

Xin lỗi tôi không hiểu. Tôi không thể viết cũng không phải là người dùng quản trị. Và khách hàng không muốn vô hiệu hóa UAC. – aco

+2

Ngay cả khi bạn đăng nhập với tư cách quản trị viên, bạn thường không có tất cả đặc quyền quản trị viên. Đó là khái niệm về UAC. Bạn có hành vi tương tự khi bạn muốn xóa thủ công tệp ở đâu đó trong "Tệp chương trình". Nhưng nếu bạn chạy ứng dụng của mình với tư cách quản trị viên (hãy bắt đầu bằng "Chạy với tư cách quản trị viên ...) bạn có thể xóa/tạo tệp trong thư mục đó. Bạn cũng có thể buộc ứng dụng của mình chạy với tư cách quản trị viên thông qua tệp kê khai. –

+0

Ok, sau đó, trong tệp app.manifest của tôi, tôi cần chèn mã này "" thay vì " "? – aco

8

An dễ dàng để hiểu được lời giải thích trong những nơi khác nhau mà bạn có thể lưu trữ dữ liệu chương trình có thể được tìm thấy ở đây:

http://blogs.msdn.com/cjacks/archive/2008/02/05/where-should-i-write-program-data-instead-of-program-files.aspx

Liên quan đến ProgramData, nó nói:

FOLDERID_ProgramData/ System. Environment.SpecialFolder.CommonApplicationData Người dùng sẽ không bao giờ muốn duyệt tại đây trong Explorer và cài đặt đã thay đổi tại đây hould ảnh hưởng đến mọi người dùng trên máy . Vị trí mặc định là % systemdrive% \ ProgramData, đây là thư mục ẩn , khi cài đặt Windows Vista. Bạn sẽ muốn tạo thư mục của mình và đặt ACLs bạn cần lúc cài đặt.

+9

Giới thiệu về "Bạn sẽ muốn tạo thư mục của mình và đặt ACL bạn cần khi cài đặt". Tôi có thể làm như thế nào? – aco

0

nó là một vấn đề khái niệm ở cái nhìn đầu tiên:

Bạn không nên sử dụng "ProgramData" thư mục nhưng một số người sử dụng tập tin cụ thể. Dữ liệu cài đặt cần thiết phải được cài đặt trong "tệp chương trình" hoặc trong sổ đăng ký.

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