ไฟล์ INI หรือ Registry หรือไฟล์ส่วนตัว?


19

ฉันต้องการบันทึกการกำหนดค่าของโครงการซึ่งรวมถึง

  1. ขนาดหน้าจอ
  2. ตำแหน่งหน้าจอ
  3. เส้นทางโฟลเดอร์
  4. การตั้งค่าผู้ใช้และอื่น ๆ

สถานที่มาตรฐานที่คุณสามารถบันทึกสิ่งเหล่านี้คือค่าการกำหนดค่าคือ:

  1. Registry
  2. ไฟล์ INI
  3. ไฟล์ส่วนบุคคล (เช่น * .cfg)

คุณเลือกระหว่างสถานที่เหล่านี้อย่างไร นอกจากนี้ยังมีข้อดีและข้อเสียของการใช้ใด ๆ ของพวกเขา?


2
คุณใช้เครื่องมืออะไร เทคโนโลยีบางอย่างมาพร้อมกับบิลด์เครื่องมือจัดการการกำหนดค่าที่ค่อนข้างดี

@ Pierre303 ปัจจุบันใช้ VS 2008 สำหรับ VC ++
Shirish11

ผู้ใช้จะต้องทำการเปลี่ยนแปลงหรือไม่
JeffO

1
คุณได้พิจารณา YAML แล้วคุณจะได้รับสิ่งที่ดีที่สุดทั้ง ini และ xml en.wikipedia.org/wiki/YAML
JF Dion

คำตอบ:


20

นอกจากนี้ยังมีข้อดีและข้อเสียของการใช้ใด ๆ ของพวกเขา?

Registry:

  • + ค่อนข้างมาตรฐานในสภาพแวดล้อม Windows
  • + โดยทั่วไปการสนับสนุนที่ดีจากตัวติดตั้ง ฯลฯ
  • - API เฉพาะแพลตฟอร์มถ้าคุณต้องการย้ายแอปพลิเคชันของคุณ
  • - ไม่สามารถอ่านได้โดยเฉพาะมนุษย์

ไฟล์ INI:

  • + รูปแบบที่เรียบง่าย
  • + แบบพกพา
  • + มนุษย์อ่านได้
  • - อาจเป็นการยากที่จะเก็บข้อมูลที่ซับซ้อนมากขึ้น (ตัวอย่างเช่นอะไรก็ตามที่ซ้อนกันมากกว่าสองระดับ)
  • ?อาจต้องเขียนโปรแกรมแยกวิเคราะห์ของคุณเอง (แม้ว่าจะไม่ยาก) หรือใช้ห้องสมุดภายนอกอย่างSimpleIni (ขอบคุณ Jonathan Merlet สำหรับความคิดเห็น)

ไฟล์ XML (ฉันเดาว่านี่เป็นตัวเลือก. cfg):

  • + รูปแบบมาตรฐาน
  • + แบบพกพา
  • + รองรับโครงสร้างที่ซ้อนกันอย่างล้ำลึก
  • - ไม่สามารถอ่านได้โดยเฉพาะมนุษย์

ส่วนตัวแล้วสำหรับแอปพลิเคชั่น Windows ฉันมักจะใช้ C # และไปกับไฟล์ส่วนตัวสำหรับผู้ใช้ที่เก็บเป็น XML ฉันทำสิ่งนี้โดยทั่วไปเนื่องจากความสามารถในการอ่านของมนุษย์มักไม่ใช่ลำดับความสำคัญในประเภทของแอปพลิเคชันที่ฉันเขียน (และแอปพลิเคชันควรมีตัวแก้ไขการกำหนดค่าไม่ว่าในกรณีใด ๆ ) และในสภาพแวดล้อม. NET ฉันมักจะจบลงด้วยวัตถุ UserConfiguration ที่เพิ่งได้รับการอนุกรมและจากแฟ้มการกำหนดค่า - เกือบจะไม่มีการพัฒนาที่เกี่ยวข้อง (การแยกวิเคราะห์การคัดเลือกสิ่งรอบ ๆ ) และคุณมีการกำหนดค่าของคุณพร้อมที่จะใช้ในสภาพแวดล้อมที่พิมพ์อย่างรุนแรง


ฉันใช้SimpleIniเพื่อแยกไฟล์ INI เมื่อไม่นานมานี้และมันก็ใช้งานได้ดี
Jonathan Merlet

@JonathanMerlet ขอบคุณฉันได้เพิ่ม SimpleIni ไว้ในโพสต์แล้ว
Daniel B

15

ฉันจะไปกับไฟล์ INI พวกเขาเป็นตัวเลือกที่เป็นมิตรกับมนุษย์มากขึ้น:

[window]
width       = 600
height      = 350
position.x  = 400
position.y  = 200

[paths]
path1       = "/some/random/path/"
path2       = "/some/other/random/path/"

[user]
name        = "Yannis"
preference  = "INI"

XML อาจเป็นตัวเลือกที่ดี แต่ไม่สามารถเอาชนะความเรียบง่ายและสง่างามของ INIs ได้:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <window>
        <width>600</width>
        <height>350</height>
        <position>
            <x>400</x>
            <y>200</y>
        </position>
    </window>
    <paths>
        <path1>/some/random/path/</path1>
        <path2>/some/other/random/path/</path1>
    </paths>
    <user>
        <name>Robert</name>
        <preference>XML</preference>
    </user>
</configuration>

INIs มีความเข้าใจเป็นอย่างดีและเป็นอิสระจากแพลตฟอร์ม อาจมีเครื่องมือไม่มากพอสำหรับพวกเขาเช่นเดียวกับไฟล์ XML เพราะใครต้องการเครื่องมือพิเศษในการอ่านและแก้ไขไฟล์ INI


2
ขำ ๆ แต่ฉันพบว่า XML ดีกว่านั้นและอ่านง่ายกว่า สำหรับผู้ที่ไม่ชอบคำฟุ่มเฟื่อย JSON เป็นทางเลือกที่เหมาะสม
Robert Harvey

3
@RobertHarvey JSON ฉันชอบ (และจะใช้ถ้าฉันต้องการการทำรังที่ลึกกว่า) แต่ XML ไม่ใช่ถ้วยชาของฉันจริงๆ ...
yannis

2
XML สามารถทำได้ดีกว่าโดยการกลิ้งค่าลงในแอตทริบิวต์ ตัวอย่างเช่น<window width="600" height="350" />
Robert Harvey

ฉันประหลาดใจจริงๆไม่มีใครพูดถึง YAML เลย ฉันรู้สึกว่ามันเป็นมิตรกับมนุษย์มากกว่า JSON แต่ก็ค่อนข้างคล้ายกับความสามารถและไวยากรณ์ เว็บไซต์ yaml.org อาจทำให้ใครก็ตามที่ไม่คุ้นเคย
Daniel B

@DanielB มีคนพูดถึง YAML ;)
yannis

6

ฉันชอบไฟล์ XML พวกเขาเป็นแบบลำดับชั้นคุณสามารถโค้งงอพวกเขาตามที่คุณคาดหวังได้พวกเขาเข้าใจได้ดีเป็นอิสระจากแพลตฟอร์มและมีซอฟต์แวร์มากมายให้อ่านและเขียนได้


6
แต่ verbose อย่างน่ากลัวและมีแนวโน้มที่จะไม่สามารถอ่านได้โดยมนุษย์
Manjabes

1
@Manjabes: ลักษณะที่ไม่น่าจะมีนัยสำคัญสำหรับไฟล์การกำหนดค่า
Robert Harvey

@robert harvey: สำคัญมากที่ฉันอยู่ สำหรับการแทรกแซงขั้นพื้นฐานด้วยการตั้งค่าที่คุณใช้ gui สำหรับการตั้งค่าขั้นสูงที่คุณไปแก้ไข ini
Pieter B

6

หากต้องการขยายคำแนะนำของ Jeff D สำหรับYAML ต่อไปนี้เป็นคำแนะนำสั้น ๆ

YAML คล้ายกับ JSON (อันที่จริงแล้ว JSON เป็นเซตย่อยของ YAML ตั้งแต่เวอร์ชัน 1.2 ของมาตรฐาน YAML และสามารถทำการแยกวิเคราะห์ JSON ที่ถูกต้องโดยตัวแยกวิเคราะห์ YAML) เมื่อเห็นอย่างแรกความแตกต่างที่สำคัญคือ YAML (โดยค่าเริ่มต้น) ใช้การเยื้องแทนการถ่ายคร่อมเพื่อแสดงลำดับชั้น นอกจากนี้ยังมีการขาดคำพูดที่น่าสังเกตสำหรับสตริง ตัวอย่างด่วนจากด้านบน:

configuration:
  window: 
    width:       600
    height:      350
    position:
      x:         400
      y:         200
  paths:
    path1:       some/random/path
    path2:       some/other/random/path
  user:
    name:        Joe Soap
    preference:  YAML

ดูหน้า YAML ของ Wikipediaสำหรับตัวอย่างที่ดีกว่า รองรับ YAML สำหรับภาษาหลักส่วนใหญ่ (ดูyaml.orgสำหรับรายละเอียด)


3

คุณลืมตัวเลือก: ฐานข้อมูล ส่วนใหญ่จะใช้ในสถานการณ์ที่คุณมีผู้ใช้ที่ลงชื่อเข้าใช้แอปพลิเคชันของคุณเมื่อแอปพลิเคชันของคุณไม่สามารถพึ่งพาผู้ใช้ที่ลงชื่อเข้าใช้ windows นี่เป็นตัวอย่างเมื่อแอปของคุณทำงานในหน้าต่างโหมดคีออสก์


คุณอาจต้องการไฟล์ INI หรือรีจิสตรีคีย์เพื่อเก็บรายละเอียดการเชื่อมต่อ / สตริงไปยังฐานข้อมูล
Class Skeleton

@CamelCase Inifile หรือรีจิสตรีคีย์ได้ถูกกล่าวถึงแล้วในคำถาม แต่ไม่ใช่ฐานข้อมูล ฉันไม่ได้ตั้งใจจะบอกว่าคุณไม่สามารถใช้หลายวิธีพร้อมกันได้
Pieter B

1

การตั้งค่าส่วนตัวของฉันคือไฟล์ XML:

ในกรณีส่วนใหญ่ฉันไม่คาดหวังว่าผู้ใช้จะต้องแก้ไขการตั้งค่าเพื่อให้ปัญหาการอ่านของมนุษย์ไม่ได้เป็นข้อโต้แย้งในกรณีนี้

หากพวกเขาต้องการแก้ไขพวกเขาคุณสามารถจัดเตรียมเครื่องมือแก้ไข - ซึ่งจะช่วยป้องกันผู้ใช้ที่ทำอะไรบางอย่างกับข้อมูล หากพวกเขาต้องการเรียกคืนการตั้งค่าเริ่มต้นคุณสามารถบอกให้ลบไฟล์ x ซึ่งผู้ใช้ส่วนใหญ่จะรู้สึกสะดวกสบาย

โปรดทราบว่าคุณยังต้องระวังว่าคุณมีสิทธิ์ในการจัดเก็บไฟล์ของคุณเนื่องจากบางสถานที่ไม่มีการเข้าถึงการเขียนตามค่าเริ่มต้นใน Windows 7 เป็นต้น


INI Files เป็นวิธีมาตรฐานที่ดีในการจัดเก็บการกำหนดค่าและพยายามและทดสอบ แต่พวกเขาแค่รู้สึก 'Windows 3.1' มาบ้างสำหรับฉัน!

อาจเป็นตัวเลือกที่ดีที่สุดหากคุณต้องการให้ผู้ใช้สามารถแก้ไขข้อมูลของพวกเขาได้


ส่วนตัวฉันจะออกไปจากรีจิสทรี สำหรับสิ่งหนึ่งที่คุณไม่สามารถรับประกันได้ว่าผู้ใช้มีสิทธิ์ที่จำเป็นในการอ่าน / เขียนไปทุกที่ที่คุณต้องการจัดเก็บข้อมูลของคุณ

ในระบบปฏิบัติการล่าสุดที่มีการทำเวอร์ชวลไลเซชันของรีจิสทรีซึ่งอาจทำให้เกิดความสับสนอย่างมากเนื่องจากคุณไม่สามารถ 'เห็น' การตั้งค่าเสมือน - มันกัดเรามากกว่าหนึ่งครั้งที่ใช้เวลาหลายชั่วโมงพยายามคิดว่าทำไมบางอย่างไม่ทำงาน


3
หากคุณกังวลเกี่ยวกับการอนุญาตสำหรับตำแหน่งรีจีสตรีคุณอาจพยายามจัดเก็บพวกเขาไว้ในตำแหน่งที่ไม่ถูกต้อง ผู้ใช้ควรมีสิทธิ์ในการ HKey_Current_User กลุ่มและนั่นคือสิ่งที่การตั้งค่าต่อผู้ใช้ควรจะเป็น!
Neil White

@NeilWhite - ตกลงว่าพวกเขาควรมีสิทธิ์ แต่ผู้ดูแลระบบไอทีที่กระตือรือร้นสามารถเปลี่ยนสิ่งนี้ได้ (หรือให้อ่าน / เขียน แต่ไม่สร้างสิทธิ์) นอกจากนี้ OP ไม่ได้กล่าวถึงว่าการตั้งค่าเหล่านี้จำเป็นสำหรับผู้ใช้แต่ละคนแต่อาจมีต่อเครื่องหนึ่งเครื่อง
Matt Wilko

นอกจากนี้รีจิสทรีอาจมีการ จำกัด ขนาด ไฟล์ไม่
linquize
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.