2008-08-09 18 views
42

Tôi là lập trình viên Windows mới và tôi không chắc nơi tôi nên lưu trữ cài đặt ứng dụng có thể định cấu hình người dùng. Tôi hiểu sự cần thiết phải cung cấp một phương tiện thân thiện với người dùng để người dùng thay đổi cài đặt ứng dụng, như Chỉnh sửa | Hình thức cài đặt hoặc tương tự. Nhưng tôi nên lưu trữ các giá trị nào sau khi người dùng nhấn vào nút Áp dụng trên biểu mẫu đó?Registry so với tệp INI để lưu trữ cài đặt ứng dụng có thể định cấu hình của người dùng

Ưu và nhược điểm của cài đặt lưu trữ trong sổ đăng ký Windows so với lưu trữ chúng trong tệp INI cục bộ hoặc tệp cấu hình hoặc tương tự là gì?

Trả lời

37

Ưu điểm của tập tin cấu hình:

  1. Dễ dàng để làm. Không cần biết bất kỳ cuộc gọi Windows API nào. Bạn chỉ cần biết giao diện I/O tập tin của ngôn ngữ lập trình của bạn.
  2. Di động. Nếu bạn chuyển ứng dụng của mình sang một hệ điều hành khác, bạn không cần phải thay đổi định dạng cài đặt của mình.
  3. Người dùng có thể chỉnh sửa. Người dùng có thể chỉnh sửa tệp cấu hình bên ngoài chương trình thực thi chương trình.

Ưu điểm đăng ký:

  1. an toàn. Người dùng không thể vô tình xóa các tập tin cấu hình hoặc hỏng dữ liệu, trừ khi anh/cô ấy biết về regedit. Và sau đó người dùng chỉ yêu cầu sự cố.
  2. Tôi không có chuyên gia lập trình Windows, nhưng tôi chắc chắn rằng việc sử dụng sổ đăng ký giúp dễ dàng thực hiện các thứ khác dành riêng cho Windows (cài đặt người dùng cụ thể, công cụ quản trị mạng như chính sách nhóm hoặc bất kỳ thứ gì khác).

Nếu bạn chỉ cần một cách đơn giản để lưu trữ thông tin cấu hình, tôi sẽ giới thiệu tệp cấu hình, sử dụng INI hoặc XML làm định dạng. Tôi đề nghị sử dụng registry chỉ khi có một cái gì đó cụ thể mà bạn muốn thoát khỏi việc sử dụng registry.

+3

JSON là một định dạng được sử dụng rộng rãi khác cho các tệp dữ liệu đơn giản hiện nay. – jpmc26

+2

thiếu điểm: cài đặt lại các cửa sổ mới không diệt các tệp ini. Một cơ sở dữ liệu tập trung cần phải được mutexed, và chúng tôi không nói chất lượng Oracle với các giao dịch rollbackable đa cấp ở đây. Cleaner/antivirus công cụ thích mess với registry của người dân, không quá nhiều tập tin ini rải rác. đăng ký chỉ là một hệ thống tập tin trong một hệ thống tập tin, đây là một http: //en.wikipedia.org/wiki/Inner-platform_effect ... –

+1

các tệp INI là một hệ thống tốt hơn. Ứng dụng khi khởi động thành công chỉ đơn giản là có thể lưu một bản sao lưu của INI để bảo vệ chống tham nhũng. – Mario

4

Theo tài liệu cho GetPrivateProfileString, bạn nên sử dụng sổ đăng ký để lưu trữ thông tin khởi tạo. Tuy nhiên, nếu bạn vẫn muốn sử dụng các tệp .ini và sử dụng các API hồ sơ chuẩn (GetPrivateProfileString, WritePrivateProfileString và các loại tương tự) để truy cập chúng, chúng cung cấp các cách tích hợp để tự động cung cấp "ảo .ini tập tin "được hỗ trợ bởi registry. Giành chiến thắng!

4

Có một câu hỏi tương tự here bao gồm một số ưu và khuyết điểm.

Tôi khuyên bạn không nên sử dụng đăng ký trừ khi ứng dụng của bạn hoàn toàn cần nó. Từ sự hiểu biết của tôi, Microsoft đang cố gắng ngăn cản việc sử dụng registry do tính linh hoạt của các tập tin cài đặt. Ngoài ra, tôi sẽ không khuyên bạn sử dụng tệp .ini, mà thay vào đó hãy sử dụng một số trong số built-in functionality để .Net để lưu cài đặt người dùng/ứng dụng.

2

Tôi đồng ý với Daniel. Nếu đó là một ứng dụng lớn, tôi nghĩ rằng tôi sẽ làm những việc trong registry. Nếu đó là một ứng dụng nhỏ và bạn muốn có các khía cạnh của nó có thể cấu hình người dùng mà không cần tạo một biểu mẫu cấu hình, hãy tìm một tệp INI nhanh.

Tôi thường làm phân tích cú pháp như thế này (nếu định dạng trong.tệp ini là tùy chọn = giá trị, 1 trên mỗi dòng, nhận xét bắt đầu bằng #):

static void Parse() 
{ 
    StreamReader tr = new StreamReader("config.ini"); 
    string line; 
    Dictionary<string, string> config = new Dictionary<string, string>(); 

    while ((line = tr.ReadLine()) != null) 
    { 
     // Allow for comments and empty lines. 
     if (line == "" || line.StartsWith("#")) 
      continue; 

     string[] kvPair = line.Split('='); 

     // Format must be option = value. 
     if (kvPair.Length != 2) 
      continue; 

     // If the option already exists, it's overwritten. 
     config[kvPair[0].Trim()] = kvPair[1].Trim(); 
    } 
} 

Chỉnh sửa: Xin lỗi, tôi nghĩ bạn đã chỉ định ngôn ngữ. Việc thực hiện ở trên là trong C#.

+0

Có [toàn bộ câu hỏi về vấn đề này] (http://stackoverflow.com/questions/217902/reading-writing-ini-file-in-c) (đối với C#). – idbrii

+0

https://docs.python.org/2/library/configparser.html –

-2

Ứng dụng của bạn đã được cài đặt bằng Chương trình thiết lập hay chỉ là "Giải nén và chạy"? Trong trường hợp đầu tiên, hãy xem các ưu và nhược điểm được nêu ở đây. Nhưng đối với Extract và chạy, Registry là theo ý kiến ​​của tôi là "không-đi", như mọi người mong đợi để có thể chỉ đơn giản là xóa các thư mục ứng dụng để thoát khỏi chương trình của bạn.

2

Như Daniel đã chỉ ra, lưu trữ dữ liệu cấu hình trong sổ đăng ký cung cấp cho bạn tùy chọn sử dụng Mẫu quản trị. Tức là, bạn có thể xác định Mẫu quản trị, sử dụng nó trong Chính sách nhóm và quản lý cấu hình của ứng dụng trên toàn mạng. Tùy thuộc vào bản chất của ứng dụng, đây có thể là một lợi ích lớn.

3

Có một lợi thế nữa khi sử dụng tệp INI trong sổ đăng ký mà tôi chưa thấy: Nếu người dùng đang sử dụng loại mã hóa dựa trên khối lượng/tệp, họ có thể lấy tệp INI được mã hóa khá dễ dàng . Với registry nó có thể sẽ có nhiều vấn đề hơn.

22

Jeff Atwood có một số lớn article về đăng ký của Windows và tại sao tốt hơn nên sử dụng tệp .INI thay thế.

Cuộc sống của tôi sẽ trở nên dễ dàng hơn nếu cài đặt cho mỗi ứng dụng được lưu trữ ở nơi tôi có thể dễ dàng nhìn thấy, thao tác và sao lưu chúng. Giống như, nói ... trong các tập tin INI.

  • Sổ đăng ký là lỗi đơn lẻ. Đó là lý do tại sao mọi mẹo chỉnh sửa đăng ký duy nhất mà bạn từng thấy sẽ bắt đầu với tuyên bố từ chối trách nhiệm lớn về cách bạn có thể phá vỡ máy tính của mình bằng regedit.
  • Sổ đăng ký là mờ và nhị phân. Tôi không thích thuế khung góc, ít nhất là tệp cấu hình XML có thể đọc được một cách hợp lý và chúng cho phép nhiều nhận xét phù hợp với bạn.
  • Sổ đăng ký phải là đồng bộ hóa với hệ thống tệp. Xóa một ứng dụng mà không cần "gỡ bỏ cài đặt" nó và bạn còn lại với việc đăng ký cũ. Hoặc nếu ứng dụng có trình gỡ cài đặt kém. Hệ thống tệp không còn là bản ghi của bản ghi nữa - nó phải được giữ đồng bộ với sổ đăng ký bằng cách nào đó. Đó là một sự vi phạm hoàn toàn nguyên tắc DRY.
  • Sổ đăng ký là nguyên khối. Giả sử bạn muốn di chuyển một ứng dụng sang một đường dẫn khác trên máy của bạn, hoặc thậm chí đến một máy khác hoàn toàn. Chúc may mắn trích xuất các cài đặt có liên quan cho một ứng dụng cụ thể từ tarball đăng ký khổng lồ. Một ứng dụng cụ thể thường có hàng tá cài đặt được rải rác trên toàn bộ sổ đăng ký.
+2

Tôi hoàn toàn đồng ý. Việc đăng ký chỉ reeks của rác và các ứng dụng rinky-dink mà bạn không bao giờ có thể xóa hoàn toàn. –

1

Đăng ký được tối ưu hóa để truy cập nhanh và cập nhật dễ dàng, và đó là cách duy nhất để thực hiện một số thứ cụ thể cho Windows như kết hợp với tiện ích mở rộng. Và bạn có thể bỏ qua đối số về việc xóa một thư mục để gỡ cài đặt chương trình của bạn - Windows Vista sẽ không cho phép bạn sửa đổi các tệp trong thư mục Program Files, vì vậy cấu hình của bạn sẽ cần phải đi trong một thư mục khác.

Có một hướng dẫn chung cho lập trình Windows - làm những việc theo cách Microsoft mong đợi bạn và cuộc sống của bạn sẽ dễ dàng hơn nhiều.

Điều đó nói rằng, tôi có thể thấy sự hấp dẫn của tệp INI và tôi sẽ không đổ lỗi cho bất kỳ ai xem xét nó.

+0

bạn dự kiến ​​sẽ đưa nội dung vào% appdata%. –

4

Sử dụng tệp ini, trong cùng thư mục với ứng dụng, có thể sao lưu nó bằng ứng dụng. Vì vậy, sau khi bạn tải lại hệ điều hành, bạn chỉ cần khôi phục thư mục ứng dụng và bạn có cấu hình theo cách bạn muốn.

-1

Có một hạn chế đối với tệp ini hoặc cấu hình và định vị chúng nếu người dùng có tùy chọn để chọn nơi chương trình được cài đặt.

+1

Đặt nó vào cùng thư mục với exe. Kéo thư mục exe từ argV [0]. – EvilTeach

+0

Bạn không thể dựa vào argv [0]. Nó có thể là tuyệt đối, tương đối hoặc hoàn toàn trống hoặc hoàn toàn sai (ví dụ, nếu một tiến trình được khởi chạy thông qua exec *). Sử dụng GetModuleFileName với tham số NULL đầu tiên thay vì theo sau bởi PathCanonicalize để loại bỏ các phần tử đường dẫn không liên quan. – syplex

+0

... và sau đó nó cũng không hoàn hảo vì nó có thể là một liên kết tượng trưng. bạn cần phải kết thúc bằng cách sử dụng 'GetFinalPathNameByHandle'. –

1

Các câu trả lời hiện có bao gồm rất nhiều nền tảng nhưng tôi nghĩ tôi sẽ đề cập đến một điểm khác.

Tôi sử dụng sổ đăng ký để lưu trữ cài đặt trên toàn hệ thống. Đó là, khi 2 hoặc nhiều chương trình cần cài đặt chính xác giống nhau. Nói cách khác, một thiết lập được chia sẻ bởi một số chương trình.

Trong tất cả các trường hợp khác, tôi sử dụng tệp cấu hình cục bộ nằm trong cùng một đường dẫn như tệp thực thi hoặc một cấp xuống (trong thư mục Cấu hình). Các lý do đã được đề cập trong các câu trả lời khác (di động, có thể được chỉnh sửa bằng trình soạn thảo văn bản, v.v.).

Tại sao đặt cài đặt toàn hệ thống vào sổ đăng ký? Vâng, tôi thấy rằng nếu cài đặt được chia sẻ nhưng bạn sử dụng tệp cấu hình cục bộ, bạn sẽ kết thúc cài đặt sao chép. Điều này có nghĩa là bạn cần phải thay đổi cài đặt ở nhiều nơi.

Ví dụ: giả sử Chương trình A và Chương trình B đều trỏ đến cùng một cơ sở dữ liệu. Bạn có thể có cài đặt đăng ký "toàn hệ thống" cho chuỗi kết nối. Nếu bạn muốn trỏ đến một cơ sở dữ liệu khác, bạn có thể thay đổi chuỗi kết nối ở một nơi và cả hai chương trình sẽ chạy trên cơ sở dữ liệu khác.

Lưu ý - không có điểm trong việc sử dụng sổ đăng ký theo cách này nếu hai hoặc nhiều chương trình không cần sử dụng cùng một giá trị. Chẳng hạn như, Chương trình A và Chương trình B đều cần một chuỗi kết nối cơ sở dữ liệu mà có thể giống nhau, nhưng không phải lúc nào. Ví dụ, tôi muốn Chương trình B bây giờ sử dụng một cơ sở dữ liệu thử nghiệm nhưng Chương trình A nên tiếp tục sử dụng một cơ sở dữ liệu sản xuất.

Với ví dụ trên, bạn có thể có một số cấu hình cục bộ ghi đè cài đặt trên toàn hệ thống nhưng có thể bắt đầu quá phức tạp đối với các tác vụ đơn giản.

+0

Đây là điều tôi muốn nói. Nếu tôi muốn thêm phần mở rộng vào chrome hoặc firefox như là một phần của quá trình cài đặt, cách để làm điều đó là thêm các mục đăng ký mà chrome/firefox mong muốn tìm. Điều này cũng áp dụng cho việc đăng ký với một số ứng dụng dưới dạng plugin/trợ giúp, v.v. Vì ứng dụng khác có thể không chạy vào thời điểm bất kỳ loại IPC nào không hoạt động. Ngoài ra nếu bạn tìm kiếm các ứng dụng, bạn không biết nếu nó là phiên bản đang được sử dụng hoặc sao lưu. Registry là con đường để đi đến đây. –