C # รับเส้นทางของ% AppData%


387

C # 2008 SP1

ฉันกำลังใช้รหัสด้านล่าง:

dt.ReadXml("%AppData%\\DateLinks.xml");

อย่างไรก็ตามฉันได้รับการยกเว้นที่ชี้ไปยังตำแหน่งที่แอปพลิเคชันของฉันทำงานอยู่:

ไม่พบส่วนหนึ่งของพา ธ 'D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml'

ฉันคิดว่า%AppData%ควรหาเส้นทางญาติ เมื่อฉันไปStart|Run|%AppData%windows explorer พาฉันไปที่ไดเรกทอรีนั้น

ฉันไม่สามารถใส่เส้นทางแบบเต็มได้เนื่องจากผู้ใช้แต่ละเครื่องมีความแตกต่างกัน

คำตอบ:


802

ในการรับไดเรกทอรีAppDataGetFolderPathวิธีที่ดีที่สุดคือใช้:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(ต้องเพิ่มusing Systemถ้าไม่มี)

%AppData%เป็นตัวแปรสภาพแวดล้อมและไม่ได้ถูกขยายโดยอัตโนมัติที่ใดก็ได้ใน. NET แม้ว่าคุณจะสามารถใช้Environment.ExpandEnvironmentVariableวิธีการดังกล่าวได้อย่างชัดเจน ฉันยังคงขอแนะนำอย่างยิ่งให้คุณใช้GetFolderPathอย่างไรก็ตามเนื่องจากอย่างที่ Johannes Rösselชี้ให้เห็นในความคิดเห็น%AppData%อาจไม่ได้รับการตั้งค่าในบางสถานการณ์

สุดท้ายเพื่อสร้างเส้นทางตามที่แสดงในตัวอย่างของคุณ:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
+1 สำหรับการเสนอทางออกที่แท้จริงไม่ต้องพึ่งพาสภาพแวดล้อม ในการเพิ่มคำตอบ: ไม่ใช่ทุกฟังก์ชั่นที่จัดการชื่อไฟล์จะขยายตัวแปรสภาพแวดล้อม โดยปกติแล้วคุณต้องทำสิ่งนี้อย่างชัดเจนไม่เช่นนั้นจะไม่สามารถใช้งานได้และคุณจะได้โฟลเดอร์% บางอย่าง% นอกจากนี้สภาพแวดล้อมไม่จำเป็นต้องมีในบางกรณีเมื่อเรียกใช้โปรแกรมภายใต้บัญชีผู้ใช้อื่นสภาพแวดล้อมของผู้ใช้จะไม่ถูกโหลดและ% Appdata% จะว่างเปล่า นั่นเป็นเหตุผลที่คุณต้องการใช้ API ที่ทำเป็นเอกสารเพื่อรับโฟลเดอร์เหล่านั้น (เว้นแต่ว่าคุณกำลังใช้แบตช์ไฟล์)
Joey

@Johannes: มีข้อมูลที่ดี ฉันเพิ่งแก้ไขคำตอบของฉันเมื่อคุณโพสต์นั้น แต่ฉันจะทำให้ชัดเจนว่า GetFolderPath เป็นที่นิยมมากกว่า ExpandEnvironmentVariable
Noldorin

+1 สำหรับ Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData) ฉันอยู่เบื้องหลังเรื่องนี้สองสามวันแล้ว
Sumit Ghosh

1
ด้วยเหตุผลบางอย่างEnvironment.GetFolderPath(Environment.SpecialFolder.ApplicationData)ส่งคืนสตริงว่างสำหรับฉัน (IIS 7, VS 2011) แก้ปัญหาโดยใช้วิธีการแก้ปัญหา Simon_Weaver - MapPathการทำแผนที่โดยใช้
Mike Keskinov

52
FYI ที่ให้ไดเรกทอรี Roaming สำหรับ Local AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)
roundcrisis

49

เส้นทางแตกต่างกันหากคุณกำลังพูดถึง ASP.NET

ฉันไม่พบค่า 'โฟลเดอร์พิเศษ' ใด ๆ ที่ชี้ไปที่ / App_Data สำหรับ ASP.NET

คุณต้องทำสิ่งนี้แทน:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(หมายเหตุ: คุณไม่ต้องการคุณสมบัติ 'ปัจจุบัน' ในคอนโทรลเลอร์ MVC)

หากมีอีกวิธี 'นามธรรม' อีกวิธีหนึ่งที่จะได้รับApp_Dataจะรักที่จะได้ยินว่า


เพิ่งทราบตั้งแต่แกน asp.net ออกมาตอนนี้ วิธีนี้อาศัย IIS โดยเฉพาะ
George Mauer

7
HostingEnvironment.MapPath(@"~/App_Data")ดีกว่าและใช้ได้ทั้งในบริบท MVC / WebAPI และ WCF ที่ไม่มี HttpContext - แต่ไม่แน่ใจเกี่ยวกับ core '
Simon_Weaver

36

ที่ดีที่สุดวิธีการใช้ไดเรกทอรี AppData, ISที่จะใช้Environment.ExpandEnvironmentVariableวิธีการ

เหตุผล:

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

ตัวอย่าง:

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

จำประเภทผู้ใช้%AppData%บางคน%appdata%และบางคน%APpData% คุณไม่ต้องการที่จะจบลงด้วย:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมแสดงว่าไม่ใช่ความผิดของคุณ (นอกเหนือจากเมื่อเป็น ) ฉันมักจะไม่บอกคนอื่นว่าไม่ได้คิดค้นวงล้อใหม่ แต่หลังจากครั้งแรกที่ฉันไปทางอื่นและตระหนักว่ามันเป็นความคิดที่ไม่ดี


ชอบตัวอย่างของpathตัวแปร :)
RBT

+1 Environment.ExpandEnvironmentVariableดีที่สุดเมื่อคุณต้องการขยายโดยไม่คำนึงว่า v env ใดที่อาจอยู่ในสตริงพา ธ
blins

24

คุณยังสามารถใช้

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

เพื่อขยาย%AppData%ตัวแปร



7

ฉันไม่คิดว่าจะวาง% AppData% ไว้ในสตริงแบบนี้

ลอง

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

แค่ต้องการแบ่งปันวิธีการเข้าถึงโฟลเดอร์ 'App_Data' อีกวิธีหนึ่งในแอปพลิเคชัน mvc ของฉันในกรณีที่มีคนต้องการสิ่งนี้

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

อาจไม่ใช่คำตอบที่ถูกต้อง แต่เป็นสิ่งที่ฉันกำลังมองหา +1
ปั้นจั่น

ทำงานกับฉันหลังจากแทนที่เครื่องหมายคำพูดเดี่ยวด้วยเครื่องหมายคำพูดคู่ Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d

1

สิ่งนี้ใช้ได้สำหรับฉันในแอปพลิเคชันคอนโซล -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

สำหรับ ASP.NET การLoad User Profileตั้งค่าจะต้องตั้งค่าในกลุ่มแอพ แต่นั่นไม่เพียงพอ มีการตั้งค่าซ่อนชื่อเป็นsetProfileEnvironmentใน\Windows\System32\inetsrv\Config\applicationHost.configซึ่งด้วยเหตุผลบางอย่างถูกปิดโดยค่าเริ่มต้นแทนในที่อธิบายไว้ในเอกสาร คุณสามารถเปลี่ยนค่าเริ่มต้นหรือตั้งค่าในกลุ่มแอพของคุณ วิธีการทั้งหมดในEnvironmentชั้นเรียนจะส่งกลับค่าที่เหมาะสม

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