ฉันจะขอเส้นทางของแอปพลิเคชันในแอปพลิเคชันคอนโซล NET ได้อย่างไร


953

ฉันจะค้นหาเส้นทางของแอปพลิเคชันในแอปพลิเคชันคอนโซลได้อย่างไร

ในWindows Formsฉันสามารถใช้Application.StartupPathเพื่อค้นหาเส้นทางปัจจุบัน แต่ดูเหมือนจะไม่สามารถใช้ได้ในแอปพลิเคชันคอนโซล


5
คุณติดตั้ง. NET Framework บนเครื่องเป้าหมาย (ไคลเอ็นต์, การพัฒนา) หรือไม่ ถ้าคำตอบของคุณเป็นจริง ดังนั้นคุณสามารถเพิ่มการอ้างอิงถึง System.Windows.Forms.dll และใช้ Application.StartupPath! นี่เป็นวิธีที่ดีที่สุดถ้าคุณต้องการที่จะทิ้งข้อยกเว้นในอนาคตต่อไป!
Ehsan Mohammadi

AppDomain.BaseDirectory เป็นไดเรกทอรีแอป โปรดทราบว่าแอปพลิเคชันสามารถทำงานแตกต่างกันใน VS env และ Win env แต่ AppDomain ควรไม่เหมือน application.path แต่ฉันหวังว่านี่จะไม่เพียง แต่สำหรับ IIS
Mertuarez

คำตอบ:


1179

System.Reflection.Assembly.GetExecutingAssembly(). 1Location

รวมกับSystem.IO.Path.GetDirectoryNameถ้าทั้งหมดที่คุณต้องการคือไดเรกทอรี

1 ตามความคิดเห็นของ Mr.Mindor:
System.Reflection.Assembly.GetExecutingAssembly().Locationส่งคืนที่แอสเซมบลีที่กำลังดำเนินการอยู่ซึ่งอาจหรือไม่อาจเป็นที่แอสเซมบลีที่ตั้งอยู่เมื่อไม่ดำเนินการ ในกรณีของชุดประกอบการคัดลอกเงาคุณจะได้รับเส้นทางในไดเรกทอรีชั่วคราว System.Reflection.Assembly.GetExecutingAssembly().CodeBaseจะกลับเส้นทาง 'ถาวร' ของแอสเซมบลี


243
System.Reflection.Assembly.GetExecutingAssembly () ตำแหน่งส่งคืนที่แอสเซมบลีการดำเนินการอยู่ในขณะนี้ซึ่งอาจหรือไม่อาจเป็นที่ตั้งของแอสเซมบลีเมื่อไม่ดำเนินการ ในกรณีของชุดประกอบการคัดลอกเงาคุณจะได้รับเส้นทางในไดเรกทอรีชั่วคราว System.Reflection.Assembly.GetExecutingAssembly (). CodeBase จะส่งคืนพา ธ ' permenant ' ของแอสเซมบลี
Mr.Mindor

13
@SamGoldberg: นั่นขึ้นอยู่กับวิธีการที่จะใช้stackoverflow.com/q/1068420/391656 หรือคุณสามารถ ... Uri ใหม่ (System.Reflection.Asset.GetExecutingAssembly () .BaseBase). LocalPath
Mr.Mindor

28
GetExecutingAssemblyส่งกลับแอสเซมบลีที่ประกอบด้วยรหัสที่กำลังดำเนินการอยู่ ซึ่งอาจไม่จำเป็นต้องเป็นชุดประกอบของ. exe มันอาจเป็นชุดประกอบที่ถูกโหลดจากตำแหน่งที่แตกต่างกันโดยสิ้นเชิง คุณจะต้องใช้GetEntryAssembly! โปรดทราบด้วยว่าCodeBaseอาจไม่สามารถตั้งค่าได้เมื่อการชุมนุมอยู่ใน GAC AppDomain.CurrentDomain.BaseDirectoryทางเลือกที่ดีกว่าคือ
bitbonk

3
กรุณาเขียนรหัสใน 4 ช่องว่างเพื่อสะดวกในการคัดลอก
fnc12

3
ถ้าคุณเรียก dll, System.Reflection.Assembly.GetExecutingAssembly () CodeBase จะได้รับ "ไฟล์: /// C:
/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll

407

คุณสามารถใช้รหัสต่อไปนี้เพื่อรับไดเรกทอรีแอปพลิเคชันปัจจุบัน

AppDomain.CurrentDomain.BaseDirectory

42
อย่าใช้สิ่งนี้ BaseDirectory สามารถตั้งค่าได้ที่รันไทม์ ไม่รับประกันว่าจะถูกต้อง (เหมือนคำตอบที่ยอมรับ)
usr

3
+1 น่าจะเป็นคำตอบที่คุณต้องการเพราะมันชดเชยการทำสำเนาเงา
George Mauer

4
@usr อะไรทำให้คุณคิดว่าBaseDirectoryสามารถตั้งค่าได้ที่ runtime? มันมีเพียงทะเยอทะยาน
bitbonk

3
@ bitbonk สามารถตั้งเวลาการสร้าง appdomain ได้
usr

3
ไม่ใช่ว่า BaseDirectory สามารถเปลี่ยนแปลงได้ในไฟล์ * .lnk ในฟิลด์ "Start in:"?
Alexander

170

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

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);

3
แค่อยากจะบอกว่าเห็นได้ชัดว่ามีตัวเลือกมากกว่า 2 ตัวเลือกโดยวิธีการโพสต์อื่น ๆ อีกมากมาย ...
vapcguy

17
หากสิ่งที่คุณพยายามทำกับเส้นทางดังกล่าวไม่สนับสนุนรูปแบบ URI ให้ใช้var localDirectory = new Uri(directory).LocalPath;
Scott Solmer

นี่เป็นเพียงความผิด สิ่งที่ปฏิบัติการไม่ได้เป็น. NET ประกอบเลย? คำตอบที่ถูกต้องคือตรวจสอบสภาพแวดล้อมและตรวจสอบบรรทัดคำสั่ง
ทำเครื่องหมาย

@ Ukuma.Scott วิธีนี้ใช้ไม่ได้หากเส้นทางประกอบด้วย & หรือ #
MatsW

82

อาจจะช้าไปหน่อย แต่ก็คุ้มค่าที่จะกล่าวถึง:

Environment.GetCommandLineArgs()[0];

หรืออย่างถูกต้องมากขึ้นเพื่อรับเส้นทางไดเรกทอรี:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

แก้ไข:

มีบางคนที่ชี้ให้เห็นว่าGetCommandLineArgsไม่รับประกันว่าจะคืนชื่อโปรแกรม ดูคำแรกในบรรทัดคำสั่งคือชื่อโปรแกรมโดยการประชุมเท่านั้น บทความกล่าวว่า "แม้ว่าโปรแกรม Windows บางโปรแกรมเท่านั้นที่ใช้การเล่นโวหารนี้ (ฉันไม่รู้ตัวเลย)" ดังนั้นจึงเป็นไปได้ที่จะ 'หลอก' GetCommandLineArgsแต่เรากำลังพูดถึงคอนโซลแอปพลิเคชัน แอปคอนโซลมักจะรวดเร็วและสกปรก ดังนั้นสิ่งนี้จึงสอดคล้องกับปรัชญา KISS ของฉัน


1
@ เราใช้สถานการณ์ที่คุณพาดพิงถึงในเชิงทฤษฎี ในบริบทของแอปพลิเคชันคอนโซลมันไม่สมเหตุสมผลเลยที่จะใช้วิธีอื่น ง่าย ๆ เข้าไว้!
Steve Mc

1
@usr mmm - ดูที่คอลัมน์ taskmgr cmdline เรียงลำดับของสิ่งที่ฉันพูด บริการระบบบางอย่างที่มีเพียงชื่อ exe ไม่เป็นไร. สิ่งที่ฉันพยายามจะพูดคือเมื่อพัฒนาแอปพลิเคชั่นคอนโซลไม่จำเป็นต้องทำสิ่งที่ซับซ้อนเกินกว่าที่พวกเขาต้องการ โดยเฉพาะอย่างยิ่งเมื่อเรามีข้อมูลอยู่แล้ว ตอนนี้ถ้าคุณใช้แอปพลิเคชันคอนโซลในลักษณะที่จะหลอกลวง GetCommandLineArgs คุณก็จะกระโดดผ่านห่วงแล้วและคุณอาจต้องถามตัวเองว่าแอปคอนโซลเป็นวิธีที่เหมาะสมหรือไม่
Steve Mc

5
โซลูชัน "แบบง่าย" ของคุณเกี่ยวข้องกับการเรียกเมธอดสองวิธี โซลูชัน "ซับซ้อน" เกี่ยวข้องกับการเรียกใช้เมธอดสองวิธี ไม่มีความแตกต่างในทางปฏิบัติ - ยกเว้นว่าโซลูชัน "แบบง่าย" สามารถให้คำตอบที่ผิดภายใต้สถานการณ์บางอย่างซึ่งไม่ได้อยู่ภายใต้การควบคุมของคุณเมื่อคุณเขียนโปรแกรม ทำไมต้องเสี่ยง? ใช้อีกสองวิธีการโทรและโปรแกรมของคุณจะไม่ซับซ้อนมากขึ้น แต่จะเชื่อถือได้มากขึ้น
Chris

3
ใช้งานได้กับสถานการณ์ของฉันโซลูชันอื่นไม่ได้ดังนั้นขอบคุณที่ให้ทางเลือกอื่น :-) ฉันกำลังใช้ตัวทดสอบ ReSharper เพื่อเรียกใช้การทดสอบ MS Unit และรหัสที่ฉันทดสอบจำเป็นต้องใช้. dll เฉพาะในไดเรกทอรีการดำเนินการ ..and Assembly.GetExecutingDirectory () ส่งกลับผลลัพธ์ที่แตกต่าง
wallismark

1
@Chris - เพื่อป้องกันคำตอบนี้ มันใช้งานได้สำหรับการทดสอบหน่วยโซลูชัน GetEntryAssembly ไม่ได้เนื่องจาก GetEntryAssembly ส่งคืน null คำตอบที่เสนอให้ GetExecutingAssembly เป็นของปลอมเพราะพวกมันจะส่งคืนไฟล์ที่เรียกใช้งานได้ก็ต่อเมื่อแอสเซมบลีที่ดำเนินการนั้นเป็นไฟล์ที่ปฏิบัติการได้ นี่ไม่ใช่วิธีง่าย ๆ แต่เป็นวิธีแก้ไขที่ถูกต้อง
ทำเครื่องหมาย

44

สำหรับทุกคนที่สนใจแอปเว็บ asp.net นี่คือผลลัพธ์ของฉันจาก 3 วิธีที่แตกต่างกัน

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

ผลลัพธ์

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

แอปพลิเคชันทำงานจาก "C: \ inetpub \ SBSPortal_staging" ดังนั้นทางออกแรกจึงไม่เหมาะสำหรับเว็บแอป


42

คำตอบข้างต้นคือ 90% ของสิ่งที่ฉันต้องการ แต่คืน Uri แทนเส้นทางปกติสำหรับฉัน

ตามที่อธิบายไว้ในโพสต์ฟอรัม MSDN จะแปลงพา ธ URI เป็น filepath ปกติได้อย่างไร ฉันใช้สิ่งต่อไปนี้:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;

1
มันทำงานได้ดีเช่นกันหาก exe ที่เป็นปัญหาคือบริการ windows และไดเรกทอรีปัจจุบันส่งคืน C: \ Windows \ system32 โค้ดด้านบนจะคืนค่าตำแหน่งที่แท้จริงของ exe
DaImTo

ยกเว้นถ้าคุณลองทำอะไรสักอย่างFile.CreateDirectory(path)มันจะให้คุณยกเว้นว่ามันไม่อนุญาตให้ใช้เส้นทางของ URI ...
vapcguy

1
น่าเสียดายที่นี่ไม่สามารถใช้ได้กับพา ธ ที่มีตัวระบุส่วน ( #อักขระ) ตัวระบุและทุกสิ่งที่ตามมาจะถูกตัดทอนจากเส้นทางที่เกิดขึ้น
bgfvdu3w

ทำไมคุณไม่สลับnew UriและSystem.IO.Path.GetDirectoryName? นั่นจะให้สตริงพา ธ ปกติกับUriคุณ
Timo

ฉันพบสิ่งนี้ดีที่สุด วิธีการเดียวกันนี้ทำงานได้อย่างน่าเชื่อถือสำหรับฉันในทุกสภาพแวดล้อม ในการผลิตให้ทำการดีบักภายในเครื่องทดสอบหน่วย ... ต้องการเปิดไฟล์เนื้อหาที่คุณรวมไว้ ("เนื้อหา - คัดลอกถ้าใหม่กว่า") ในการทดสอบหน่วย มันอยู่ที่นั่น
Timo

29

คุณอาจต้องการทำสิ่งนี้:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

23

คุณสามารถใช้อันนี้แทน

System.Environment.CurrentDirectory

นี้จะได้รับโฟลเดอร์แม้ว่าปฏิบัติการ
Iain

สามารถเปลี่ยนแปลงได้หลายวิธี (การตั้งค่าทางลัด ฯลฯ ) ... ดีกว่าที่จะไม่ใช้
Yousha Aleayoub

23

หากคุณกำลังมองหาวิธีที่เข้ากันได้กับ. NET Core ให้ใช้

System.AppContext.BaseDirectory

สิ่งนี้ถูกนำมาใช้ใน. NET Framework 4.6 และ. NET Core 1.0 (และ. NET Standard 1.3) ดู: AppContext.BaseDirectory ทรัพย์สิน

ตามหน้านี้ ,

นี่คือการแทนที่ที่ต้องการสำหรับ AppDomain.CurrentDomain.BaseDirectory ใน. NET Core


ดูเพิ่มเติมที่ github.com/dotnet/runtime/issues/13051สำหรับแอพ dotnet console ในตัว คำแนะนำที่นี่คือการใช้Process.GetCurrentProcess().MainModule.FileName
Gavin

19

สำหรับแอปพลิเคชั่นคอนโซลคุณสามารถลอง:

System.IO.Directory.GetCurrentDirectory();

เอาท์พุท (บนเครื่องท้องถิ่นของฉัน):

c: \ users \ xxxxxxx \ Documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug

หรือคุณสามารถลอง (มีแบ็กสแลชเพิ่มเติมในตอนท้าย):

AppDomain.CurrentDomain.BaseDirectory

เอาท์พุท:

c: \ users \ xxxxxxx \ Documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug \


" BaseDirectoryสามารถตั้งค่าที่ runtime ไม่รับประกันว่าจะถูกต้อง"
Yousha Aleayoub


9

คุณสามารถเพิ่มการอ้างอิงโครงการของคุณSystem.Windows.Formsแล้วใช้System.Windows.Forms.Application.StartupPath ตามปกติ

ดังนั้นไม่จำเป็นต้องใช้วิธีการที่ซับซ้อนมากขึ้นหรือใช้การสะท้อนกลับ


ฉันใช้อันนั้นและมันใช้งานได้ดี แต่ครั้งหนึ่งฉันใช้วิธีการนี้ในโครงการทดสอบหน่วยของฉัน และแน่นอนมันล้มเหลวเพราะมันกำลังมองหาไฟล์ของฉันใน C: \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 14.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW
2560

@ ananart ดังนั้นฉันจะทำให้มันทำงานได้อย่างไรในขณะที่ทดสอบหน่วย?
Nicholas Siegmundt

7

ฉันใช้มันถ้า exe ควรจะถูกเรียกโดยดับเบิลคลิก

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

5
สิ่งนี้ไม่ถูกต้องเพราะคุณจะได้รับผลการสุ่มไดเรกทอรี
amuliar

คำสั่งนี้ส่งคืน Environment.CurrentDirectory ซึ่งอาจเปลี่ยนแปลงได้ขณะรันไทม์ไปยังพา ธ ใด ๆ ดังนั้นจึงไม่ใช่โซลูชันที่เชื่อถือได้
Yury Kozlov

7

ฉันได้ใช้

System.AppDomain.CurrentDomain.BaseDirectory

เมื่อฉันต้องการค้นหาพา ธ ที่สัมพันธ์กับโฟลเดอร์แอปพลิเคชัน สิ่งนี้ใช้ได้กับทั้งแอปพลิเคชัน ASP.Net และ winform นอกจากนี้ยังไม่ต้องการการอ้างอิงใด ๆ ถึงแอสเซมบลี System.Web


7

บรรทัดต่อไปนี้จะให้เส้นทางแอปพลิเคชันแก่คุณ:

var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

วิธีการแก้ปัญหาข้างต้นทำงานอย่างถูกต้องในสถานการณ์ต่อไปนี้:

  • แอพง่าย ๆ
  • ในโดเมนอื่นที่ Assembly.GetEntryAssembly () จะส่งคืน null
  • DLL ถูกโหลดจากทรัพยากรที่ฝังเป็นอาร์เรย์ไบต์และโหลดไปยัง AppDomain เป็น Assembly.Load (byteArrayOfEmbeddedDll)
  • ด้วยการmkbundleรวมกลุ่มของโมโน(ไม่มีวิธีการอื่นที่ใช้งานได้)

ภายใต้ดีบักเกอร์บน linux ผลตอบแทนนี้: / usr / share / dotnet
Vladimir

6

ฉันหมายความว่าทำไมไม่ใช้วิธี ap / invoke?

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    public class AppInfo
    {
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
            private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
            private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
            public static string StartupPath
            {
                get
                {
                    StringBuilder stringBuilder = new StringBuilder(260);
                    GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
                    return Path.GetDirectoryName(stringBuilder.ToString());
                }
            }
    }

คุณจะใช้มันเหมือนกับ Application.StartupPath:

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");

2
ทำไม p / เรียกใช้เมื่อมี. NET มากขนาดนี้?
ProfK

7
@ user3596865 เนื่องจากต้องการการพึ่งพา Windows อย่างหนักและเข้ากันไม่ได้กับ DNX หรือ Mono และอาจมีการเปลี่ยนแปลงครั้งใหญ่ในเวอร์ชั่น Windows ในอนาคต ดังนั้นอีกครั้ง: ทำไมเราควรใช้ pinvoke ที่นี่?
Ben

5

Assembly.GetEntryAssembly().Location หรือ Assembly.GetExecutingAssembly().Location

ใช้ร่วมกับSystem.IO.Path.GetDirectoryName()เพื่อให้ได้ไดเรกทอรีเท่านั้น

เส้นทางจากGetEntryAssembly()และGetExecutingAssembly()อาจแตกต่างกันแม้ว่าในกรณีส่วนใหญ่ไดเรกทอรีจะเหมือนกัน

ด้วยGetEntryAssembly()คุณต้องระวังว่าสิ่งนี้สามารถส่งคืนnullหากโมดูลรายการไม่ได้รับการจัดการ (เช่น C ++ หรือ VB6 ปฏิบัติการ) ในกรณีเหล่านั้นเป็นไปได้ที่จะใช้GetModuleFileNameจาก Win32 API:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);

5

ใน VB.net

My.Application.Info.DirectoryPath

เหมาะกับฉัน (Application Type: Class Library) ไม่แน่ใจเกี่ยวกับ C # ... ส่งคืนพา ธ ที่ไม่มีชื่อไฟล์เป็นสตริง


4
AppDomain.CurrentDomain.BaseDirectory

จะแก้ไขปัญหาให้อ้างอิงไฟล์อ้างอิงบุคคลที่สามพร้อมแพ็คเกจการติดตั้ง


11
คำตอบนี้ได้รับการแนะนำ 5 ปีที่ผ่านมามากกว่าหนึ่งครั้ง
PL

2

ไม่มีวิธีการเหล่านี้ทำงานในกรณีพิเศษเช่นการใช้ลิงก์สัญลักษณ์ไปยัง exe พวกเขาจะคืนตำแหน่งของลิงก์ไม่ใช่ exe จริง

ดังนั้นสามารถใช้QueryFullProcessImageNameเพื่อหลีกเลี่ยง:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]StringBuilder lpExeName, ref int lpdwSize);

    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern IntPtr OpenProcess(
        UInt32 dwDesiredAccess,
        [MarshalAs(UnmanagedType.Bool)]
        Boolean bInheritHandle,
        Int32 dwProcessId
    );
}

public static class utils
{

    private const UInt32 PROCESS_QUERY_INFORMATION = 0x400;
    private const UInt32 PROCESS_VM_READ = 0x010;

    public static string getfolder()
    {
        Int32 pid = Process.GetCurrentProcess().Id;
        int capacity = 2000;
        StringBuilder sb = new StringBuilder(capacity);
        IntPtr proc;

        if ((proc = NativeMethods.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pid)) == IntPtr.Zero)
            return "";

        NativeMethods.QueryFullProcessImageName(proc, 0, sb, ref capacity);

        string fullPath = sb.ToString(0, capacity);

        return Path.GetDirectoryName(fullPath) + @"\";
    }
}


1

โซลูชันอื่นกำลังใช้พา ธ สัมพัทธ์ที่ชี้ไปยังพา ธ ปัจจุบัน:

Path.GetFullPath(".")

สิ่งนี้จะได้รับไดเรกทอรีปัจจุบันไม่ใช่ตำแหน่งของ EXE เริ่มต้น
tenfour

0

ฉันไม่เห็นใครแปลง LocalPath ที่จัดหาโดย. Net Core reflection ไปเป็นเส้นทาง System.IO ที่ใช้งานได้ดังนั้นนี่คือเวอร์ชันของฉัน

public static string GetApplicationRoot()
{
   var exePath = new Uri(System.Reflection.
   Assembly.GetExecutingAssembly().CodeBase).LocalPath;

   return new FileInfo(exePath).DirectoryName;

}

สิ่งนี้จะส่งคืนพา ธ ที่จัดรูปแบบ "C: \ xxx \ xxx" แบบเต็มไปยังที่ที่โค้ดของคุณอยู่


0

มีหลายวิธีในการรับพา ธ ที่สามารถใช้งานได้ซึ่งเราควรใช้มันขึ้นอยู่กับความต้องการของเราที่นี่คือลิงค์ที่อธิบายวิธีการต่าง ๆ

วิธีต่างๆในการรับเส้นทางที่เรียกใช้แอปพลิเคชัน


-1

นี่คือโซลูชันที่เชื่อถือได้ซึ่งทำงานกับแอปพลิเคชัน32 บิตและ64 บิต

เพิ่มการอ้างอิงเหล่านี้:

ใช้ System.Diagnostics;

ใช้ระบบการจัดการ

เพิ่มวิธีนี้ในโครงการของคุณ:

public static string GetProcessPath(int processId)
{
    string MethodResult = "";
    try
    {
        string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;

        using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
        {
            using (ManagementObjectCollection moc = mos.Get())
            {
                string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();

                MethodResult = ExecutablePath;

            }

        }

    }
    catch //(Exception ex)
    {
        //ex.HandleException();
    }
    return MethodResult;
}

ตอนนี้ใช้มันเพื่อ:

int RootProcessId = Process.GetCurrentProcess().Id;

GetProcessPath(RootProcessId);

โปรดสังเกตว่าถ้าคุณทราบรหัสของกระบวนการแล้ววิธีนี้จะส่งคืน ExecutePath ที่สอดคล้องกัน

พิเศษสำหรับผู้ที่สนใจ:

Process.GetProcesses() 

... จะทำให้คุณมีกระบวนการที่กำลังทำงานอยู่ทั้งหมดและ ...

Process.GetCurrentProcess()

... จะให้กระบวนการปัจจุบันพร้อมกับข้อมูลของพวกเขาเช่น Id และอื่น ๆ และยังมีการควบคุมที่ จำกัด เช่น Kill เป็นต้น *


-5

คุณสามารถสร้างชื่อโฟลเดอร์เป็นทรัพยากรภายในโครงการโดยใช้ Solution Explorer จากนั้นคุณสามารถวางไฟล์ภายในทรัพยากร

private void Form1_Load(object sender, EventArgs e) {
    string appName = Environment.CurrentDirectory;
    int l = appName.Length;
    int h = appName.LastIndexOf("bin");
    string ll = appName.Remove(h);                
    string g = ll + "Resources\\sample.txt";
    System.Diagnostics.Process.Start(g);
}

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