รับเส้นทางโฟลเดอร์ปัจจุบัน


222

ฉันต้องการสร้างโปรแกรมที่แปลงไฟล์ ผมอยากให้ผู้ใช้สามารถวางแฟ้มที่ปฏิบัติการในไดเรกทอรีใด ๆ และเมื่อรันโปรแกรมที่ (ดับเบิลคลิกที่ .exe) ที่ฉันต้องการโปรแกรมการประมวลผลไฟล์ทั้งหมดที่อยู่ในโฟลเดอร์ปัจจุบันที่ไฟล์ exe ที่มีอยู่ โปรแกรมสามารถกำหนดเส้นทางที่กำลังดำเนินการอยู่ได้อย่างไร?

ฉันพยายามSystem.Windows.Forms.Application.StartupPathแต่ดูเหมือนว่าจะเป็นวิธีที่ผิด

ความคิดใด ๆ

คำตอบ:


335

คุณไม่ควรใช้Directory.GetCurrentDirectory()ในกรณีของคุณเนื่องจากไดเรกทอรีปัจจุบันอาจแตกต่างจากโฟลเดอร์เรียกใช้งานโดยเฉพาะอย่างยิ่งเมื่อคุณรันโปรแกรมผ่านทางลัด

มันจะดีกว่าที่จะใช้Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);สำหรับวัตถุประสงค์ของคุณ ส่งคืนชื่อพา ธ ที่แอสเซมบลีที่กำลังดำเนินการอยู่ในปัจจุบัน

ในขณะที่วิธีการที่แนะนำของฉันช่วยให้คุณสามารถแยกความแตกต่างระหว่างชุดประกอบที่ดำเนินการชุดประกอบหรือชุดประกอบอื่น ๆ ดังที่Soner Gönülกล่าวในคำตอบของเขา

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

อาจเพียงพอ นี่จะเท่ากับ

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly () และ GetExecutingAssembly () มีความแตกต่างที่น่าสนใจ สำหรับรายละเอียดอ้างอิงstackoverflow.com/a/18562036/30289
bhadra

3
ตามที่ฉันได้กล่าวไว้: สิ่งนี้จะคืนค่าชื่อพา ธ ที่แอสเซมบลีที่กำลังดำเนินการอยู่ ความแตกต่างระหว่างGetEntryAssemblyและGetExecutingAssemblyไม่ได้แปลกใจเท่าไหร่ก็ชัดเจนด้วยชื่อฟังก์ชั่น หากพวกเขาทำสิ่งเดียวกันทำไมต้องมีสองฟังก์ชั่น :-)
Thorsten Dittmar

2
+1 Assembly.GetEntryAssembly () ช่วยฉันในกรณีที่เรียกใช้แอปพลิเคชันผ่าน clickonce
Artiom

9
นี่คือใน System.Reflection ดังนั้นSystem.Reflection.Assembly.GetExecutingAssembly().Locationเสร็จสมบูรณ์ - ถ้าคุณกำลังทดสอบจากหน้าต่างทันที
ถั่วแดง

147
System.AppDomain.CurrentDomain.BaseDirectory

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


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

สมบูรณ์ สิ่งนี้ทำงานได้อย่างอิสระสำหรับแอปพลิเคชันใด ๆ โดยเฉพาะเมื่อใช้ Streamreader ซึ่งสามารถอ่านพา ธ สัมบูรณ์ที่แตกต่างกันขึ้นอยู่กับประเภทของแอปพลิเคชัน
user3326078

40

ฉันสร้างแอปพลิเคชั่นคอนโซลอย่างง่ายด้วยรหัสต่อไปนี้:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

ฉันคัดลอกไฟล์ที่เรียกทำงานได้ที่เป็นไปC:\temp2ได้ จากนั้นฉันก็วางทางลัดไปยังไฟล์ที่เรียกใช้C:\temp3งานได้แล้วรันมัน (หนึ่งครั้งจาก exe เองและอีกครั้งจากทางลัด) มันให้ผลลัพธ์ต่อไปนี้ทั้งสองครั้ง:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

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

UPDATE: ผมปรับเปลี่ยนคุณสมบัติทางลัดเปลี่ยน "Start ใน:" C:\temp3เพื่อ สิ่งนี้ส่งผลให้เกิดผลลัพธ์ต่อไปนี้:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... ซึ่งแสดงให้เห็นอย่างน้อยก็มีความแตกต่างระหว่างวิธีการต่าง ๆ


2
ขอบคุณมาก.
baj9032

หมายเหตุสำคัญ ไดเรกทอรีการทำงานจะไม่เหมือนกับไดเรกทอรีที่ติดตั้งอยู่เสมอ
Jordan


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

จาก Path.GetDirectoryName

ส่งคืนข้อมูลไดเร็กทอรีสำหรับสตริงพา ธ ที่ระบุ

จาก Application.ExecutablePath

รับค่าพา ธ สำหรับไฟล์เรียกทำงานที่สตาร์ทแอ็พพลิเคชันรวมถึงชื่อไฟล์เรียกทำงาน


19

ใช้สิ่งนี้

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

คุณสามารถใช้สิ่งนี้ได้เช่นกัน

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);


6

1

Directory.GetCurrentDirectory();

2

Thread.GetDomain().BaseDirectory

3

Environment.CurrentDirectory

Environment.CurrentDirectoryสามารถเปลี่ยนแปลงได้หลายวิธี ... (การตั้งค่าตัดภาพ ฯลฯ )
Yousha Aleayoub


0

หากคุณต้องการเส้นทาง exe คุณสามารถใช้ System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

สิ่งนี้ทำงานได้ดีที่สุดสำหรับฉันโดยเฉพาะอย่างยิ่งเมื่อใช้ dotnet core single file publishing Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

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