คุณสมบัติการตั้งค่าเริ่มต้นถูกเก็บไว้ที่ไหน


145

ฉันคิดว่าฉันรู้เรื่องนี้ แต่วันนี้ฉันได้รับการพิสูจน์ผิด - อีกครั้ง

ใช้ VS2008, .NET 3.5 และ C # ฉันเพิ่มการตั้งค่าผู้ใช้ในแท็บการตั้งค่าคุณสมบัติด้วยค่าเริ่มต้นจากนั้นอ่านการใช้รหัสนี้:

myTextBox.Text = Properties.Settings.Default.MyStringProperty;

จากนั้นหลังจากที่ผู้ใช้แก้ไขค่าในกล่องโต้ตอบตัวเลือกฉันบันทึกมันเช่นนี้:

Properties.Settings.Default.MyStringProperty = myTextBox.Text;
Properties.Settings.Default.Save();

คำถามของฉันคือที่ไหนค่าใหม่นี้ถูกบันทึกไว้ที่ไหน? ไฟล์ MyApp.exe.config ในไดเรกทอรีที่ปฏิบัติการไม่ได้รับการปรับปรุง แต่ยังคงมีค่าเริ่มต้น นอกจากนี้เท่าที่ฉันสามารถบอกได้ว่าไม่มีไฟล์อื่นในไดเรกทอรีนั้นที่ได้รับการอัปเดต! อย่างไรก็ตามเมื่อโปรแกรมอ่านค่ากลับมามันจะได้รับค่าที่เปลี่ยนแปลงดังนั้นฉันจึงรู้ว่ามันบันทึกไว้ที่ใดที่หนึ่ง ...

นี่ไม่ใช่แค่วิชาการฉันต้องสามารถแก้ไขค่าด้วยตนเองในเช้าวันนี้และทำให้ตัวเองนิ่งงันเมื่อฉันไม่พบสิ่งที่เปลี่ยนแปลง


2
เป็นเรื่องสำคัญที่จะต้องทราบว่าที่เก็บข้อมูลอาจมีการเปลี่ยนแปลงระหว่างเวอร์ชันต่าง ๆ ของเฟรมเวิร์กหรือระบบปฏิบัติการ อย่า hardcode อะไรก็ตามโดยทางโปรแกรมไปยังที่เก็บสินค้า
เกร็ก D

หากคุณอยู่ใน Visual Studio พัฒนาแอพใหม่ให้ตรวจสอบที่ AppData \ Local \ Microsoft \ YOUR APPLICATION NAME ชื่อไฟล์คือ user.config ฉันอยู่ใน Windows 7
JenonD

หรือใต้ AppData \ Local one
KansaiRobot

สิ่งที่ฉันดิ้นรนกับสิ่งนี้ทำให้ฉันเกิดคำถามนี้และสิ่งอื่น ๆ : user.config ไม่ได้ถูกสร้างขึ้นจนกว่า applicationsSettings.Save (); ถูกเรียก. (โดยที่ applicationSettings ถูกกำหนดไว้ ApplicationSettings applicationSettings = new ApplicationSettings (นี้);)
รวม

คำตอบ:


142

เพื่อให้ทำงานกับนโยบาย Windows รุ่นใหม่ที่อนุญาตเฉพาะการเข้าถึงเพื่ออ่านโดยค่าเริ่มต้นไปยังโฟลเดอร์ Program Files (เว้นแต่คุณจะแจ้งให้ยกระดับด้วย UAC แต่เป็นอีกหัวข้อหนึ่ง ... ) แอปพลิเคชันของคุณจะมีโฟลเดอร์การตั้งค่าภายใต้%userprofile%\appdata\localหรือ%userprofile%\Local Settings\Application Dataขึ้นอยู่กับเวอร์ชันของ Windows ที่คุณกำลังใช้งานสำหรับการตั้งค่าเฉพาะของผู้ใช้ หากคุณเก็บการตั้งค่าสำหรับผู้ใช้ทั้งหมดแล้วพวกเขาจะอยู่ในโฟลเดอร์ที่สอดคล้องกันภายใต้C:\usersหรือC:\Documents and Settingsสำหรับโปรไฟล์ของผู้ใช้ทั้งหมด (เช่น: C:\users\public\appdata\local)


3
นอกจากนี้. config ที่สร้างใน Visual Studio ซึ่งจบลงในโฟลเดอร์ของไฟล์เรียกทำงานผมเชื่อว่าใช้สำหรับการดีบักเท่านั้น เมื่อบรรจุแอปพลิเคชันสุดท้ายคุณจะไม่รวม. config นี้เนื่องจากจะสร้างขึ้นในครั้งแรกที่ผู้ใช้เรียกใช้แอปพลิเคชัน
Eddins จะ

11
รุ่นที่ใหม่กว่า? นี่เป็นกรณีตั้งแต่ windows 2000 คุณเพิ่งหนีไปเพราะคุณทำงานในฐานะผู้ดูแลระบบ
Joel Coehoorn

1
@Joel Coehoorn: จริง แต่ตอนนี้ในบัญชีผู้ดูแลระบบใน Windows Vista และในคุณไม่สามารถเข้าถึงการเขียนไฟล์โปรแกรมโดยไม่ต้องแจ้งให้ยกระดับ UAC โดยค่าเริ่มต้น นั่นเป็นนโยบายที่เปลี่ยนไป :)
jasonh

2
ควรสังเกตว่าโฟลเดอร์นั้นมีการเปลี่ยนแปลงทุกครั้งที่มีการอัปเกรด - ดังนั้นผู้ใช้จะสูญเสียการตั้งค่าของพวกเขาทุกครั้งที่คุณอัพเดตซอฟต์แวร์
Ian Boyd

17
ที่จริงแล้วพวกเขาทำไม่ได้ คุณต้องสร้างการตั้งค่าตั้งชื่อบางอย่างเช่น "UpgradeNeeded" และตั้งค่าเป็นจริง จากนั้นเมื่อแอปของคุณเริ่มให้ตรวจสอบสิ่งนี้ ถ้าเป็นจริงให้เรียก Properties.Settings.Default.Upgrade (), .Save () และ .Reload () จากนั้นรีเซ็ต UpgradeNeeded เป็น false และบันทึก
jasonh

86

คุณสามารถรับเส้นทางโดยทางโปรแกรม:

using System.Configuration;  // Add a reference to System.Configuration.dll
...
var path = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;

1
อืมฉันเห็นสถานการณ์ที่เส้นทางที่ส่งคืนโดยนี่ไม่ใช่เส้นทางที่ใช้โดยการตั้งค่า ความเข้าใจใด ๆ
George Mauer

1
@GeorgeMauer คุณหมายถึงRoamingหรืออาจจะLocalLowแทนLocal? ConfigurationUserLevelขึ้นอยู่กับโปรไฟล์ของผู้ใช้ที่โรมมิ่งหรือท้องถิ่น ใน บริษัท มักจะโรมมิ่ง
Kay Zed

การลิงก์ไปยังคำตอบนี้และความคิดเห็นของฉันอยู่ข้างใต้แสดงว่าเส้นทางนั้นมีลักษณะอย่างไร
Kay Zed

ฉันค้นหาคำตอบเดียวกันนี้ได้ทุกที่ให้ใช้ ConfigurationManager.OpenExeConfiguration () - แต่นั่นให้สามตัวเลือกขึ้นอยู่กับว่าคุณผ่าน ConfigurationUserLevel ซึ่งมีค่าแตกต่างกันสามแบบ - มันคืออะไร คุณจะทราบได้อย่างไรว่าในโปรแกรมในรหัสในขณะใช้งานไฟล์ใดที่โปรแกรมได้รับการตั้งค่า
เดฟ

ไม่มี: รับการกำหนดค่าที่ใช้กับผู้ใช้ทั้งหมด, PerUserRoaming: รับการกำหนดค่าโรมมิ่งที่ใช้กับผู้ใช้ปัจจุบัน, PerUserRoamingAndLocal: รับการกำหนดค่าในท้องถิ่นที่ใช้กับผู้ใช้ปัจจุบัน
Akbaritabar

8

ขอบคุณที่ชี้ให้ฉันในทิศทางที่ถูกต้อง ฉันพบ user.config อยู่ที่ความน่าพิศวงนี้: c: \ users \ USER \ AppData \ Local \ COMPANY \ APPLICATION.exe_Url_LOOKSLIKESOMEKINDOFHASH \ VERSION \ user.config

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


รู้ได้อย่างไรว่า LOOKSLIKESOMEKINDOFHASH
NeoSvet

1
Properties.Settings.Default.Upgrade () การโทรจะทำแบบเดียวกันโดยอัตโนมัติ มันคืนค่าการกำหนดค่าจากรุ่นก่อนหน้านี้เช่นเดียวกับ @jasonh กล่าวในการตอบกลับอื่น ๆ ข้างต้น
Alex

5

จะถูกบันทึกไว้ในเอกสารและผู้ใช้% Settings \% \ Local Settings \ Application Data ...... ฯลฯ ค้นหาไฟล์ที่เรียกว่าคุณuser.configมี

สถานที่อาจมีการเปลี่ยนแปลง


5
ที่จริงแล้วตัวแปรสภาพแวดล้อมที่ถูกต้องสำหรับคุณสมบัติเฉพาะของผู้ใช้คือ% userprofile% การระบุเอกสารและการตั้งค่าภายใต้ Vista หรือ 7 จะทำให้โฟลเดอร์หายไปหรือการอนุญาตที่ขาดหายไปยังโฟลเดอร์ที่พบ
jasonh

1

หนึ่งในบริการ windows ของฉันถูกล็อกออนเป็น Local System ใน windows server 2016 และฉันสามารถหา user.config ภายใต้ C: \ Windows \ SysWOW64 \ config \ systemprofile \ AppData \ Local \ {ชื่อแอปพลิเคชันของคุณ}

ฉันคิดว่าวิธีที่ง่ายที่สุดคือการค้นหาชื่อแอปพลิเคชันของคุณบนไดรฟ์ C แล้วตรวจสอบว่า user.config อยู่ที่ไหน


0

การตั้งค่าเฉพาะผู้ใช้จะถูกบันทึกไว้ในโฟลเดอร์ Application Data ของผู้ใช้สำหรับแอปพลิเคชันนั้น มองหาuser.configไฟล์

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


0

พวกเขาจะถูกบันทึกไว้ในYOUR_APP.exe.configไฟล์จะถูกบันทึกไว้ในโฟลเดอร์เดียวกันกับYOUR_APP.exeไฟล์<userSettings>ส่วน:

   <userSettings>
      <ShowGitlabIssues.Properties.Settings>
         <setting name="SavedUserName" serializeAs="String">
            <value />
         </setting>
         <setting name="SavedPassword" serializeAs="String">
            <value />
         </setting>
         <setting name="CheckSave" serializeAs="String">
            <value>False</value>
         </setting>
      </ShowGitlabIssues.Properties.Settings>
   </userSettings>

นี่คือรหัส cs:

public void LoadInfoLogin()
{
    if (Properties.Settings.Default.CheckSave)// chkRemember.Checked)
    {
        txtUsername.Text = Properties.Settings.Default.SaveUserName;
        txtPassword.Text = Properties.Settings.Default.SavePassword;
        chkRemember.Checked = true;
    }
...

-1

สำหรับทุกคนที่สงสัยว่าการตั้งค่าแอพจาก Microsoft Store อยู่ที่ใดพวกเขาอยู่ใน WindowsApps ซึ่งถูกล็อคไว้มาก แต่คุณสามารถไปที่นั่นได้โดยเปิดแอพแล้วเปิดพา ธ ไฟล์ด้วย Task-Manager

แต่มีโอกาสมากขึ้นที่พวกเขาจะถูกบันทึกไว้ C:\Users\[USERNAME]\AppData\Local\Packages\[NUMBERS][COMPANY].[APPLICATION]_[RANDOMDATA]\LocalCache\Local\[COMPANY]\[APPLICATION].exe_Url_[RANDOMDATA]\[VERSION]\user.config.


-17

มีโฟลเดอร์ชื่อ "คุณสมบัติ" ใต้โฟลเดอร์รูทโครงการของคุณและมีไฟล์ * .settings ภายใต้โฟลเดอร์นั้น นั่นคือสิ่งที่มันถูกเก็บไว้


1
มันเป็นเรื่องที่เหมาะสมในช่วง Developement หลังจากการปรับใช้พวกเขาไปที่อื่น
Joel Coehoorn

2
ฉันทำงานนี้ในสภาพแวดล้อมการพัฒนาและไฟล์ยังคงไม่เปลี่ยนแปลง มันเก็บเฉพาะค่าเริ่มต้นที่นั่นไม่ใช่การปรับปรุง
Stan R.

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