.NET කොන්සෝල යෙදුමකින් යෙදුමේ මාර්ගය ලබා ගන්නේ කෙසේද?


970

කොන්සෝල යෙදුමක යෙදුමේ මාර්ගය සොයා ගන්නේ කෙසේද?

දී වින්ඩෝස් ආකෘති පත්ර , මම භාවිතා කළ හැකි Application.StartupPathවත්මන් මාර්ගය සොයා ගැනීමට, නමුත් මේ කරන කොන්සෝල අයදුම් ලබා ගත යුතු බවක් පෙනෙන්නට නැත.


5
ඔබ ඉලක්ක (සේවාලාභී, සංවර්ධන) යන්ත්‍රය මත .NET රාමුව ස්ථාපනය කරනවාද? ඔබේ පිළිතුර සත්‍ය නම්; එබැවින්, ඔබට System.Windows.Forms.dll වෙත යොමු කිරීමක් කළ හැකි අතර Application.StartupPath භාවිතා කරන්න! අනාගත ව්‍යතිරේකයන් අතහැර දැමීමට ඔබට අවශ්‍ය නම් මෙය හොඳම ක්‍රමයයි!
එහ්සාන් මොහොමඩි

AppDomain.BaseDirectory යනු යෙදුම් නාමාවලියකි. VS env සහ Win env වල යෙදුමට වෙනස් ලෙස හැසිරීමට හැකි බව මතක තබා ගන්න. නමුත් AppDomain එක application.path හා සමාන විය යුතු නමුත් මෙය IIS සඳහා පමණක් නොවන බව මම විශ්වාස කරමි.
මර්ටුවාරෙස්

Answers:


1200

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

System.IO.Path.GetDirectoryNameඔබට අවශ්‍ය වන්නේ නාමාවලිය නම් එය ඒකාබද්ධ කරන්න.

1 මින්ඩෝර් මහතාගේ ප්‍රකාශයට අනුව:
System.Reflection.Assembly.GetExecutingAssembly().Location ක්‍රියාත්මක වන එකලස් කිරීම දැනට පවතින ස්ථානයට නැවත පැමිණේ. සෙවනැලි පිටපත් කිරීමේ එකලස් කිරීමේදී, ඔබට තාවකාලික නාමාවලියක මාර්ගයක් ලැබෙනු ඇත. System.Reflection.Assembly.GetExecutingAssembly().CodeBaseඑකලස් කිරීමේ 'ස්ථිර' මාර්ගය නැවත ලබා දෙනු ඇත.


245
System.Reflection.Assembly.GetExecitingAssembly (). ක්‍රියාත්මක වන එකලස් කිරීම දැනට පවතින ස්ථානයට නැවත පැමිණේ, එය ක්‍රියාත්මක නොවන විට එකලස් කිරීම පිහිටා ඇති ස්ථානය හෝ නොවිය හැකිය. සෙවනැලි පිටපත් කිරීමේ එකලස් කිරීමේදී, ඔබට තාවකාලික නාමාවලියක මාර්ගයක් ලැබෙනු ඇත. System.Reflection.Assembly.GetExecutingAssembly (). CodeBase වන 'ආපසු ස්ථිරව තැනූ සභාව' මාර්ගය.
මින්ඩෝර් මහතා

13
Am සැම්ගෝල්ඩ්බර්ග්: එය භාවිතා කරන ආකාරය මත රඳා පවතී: stackoverflow.com/q/1068420/391656 . නැත්නම් ඔබට පුළුවන් ... නව යූරි (System.Reflection.Assembly.GetExecitingAssembly (). CodeBase) .ලොකල්පාත්
මින්ඩෝර් මහතා

29
GetExecutingAssemblyදැනට ක්‍රියාත්මක වන කේතය අඩංගු එකලස් කිරීම . මෙය අනිවාර්යයෙන්ම කොන්සෝලය නොවිය හැකිය .exe එකලස් කිරීම. එය සම්පූර්ණයෙන්ම වෙනස් ස්ථානයකින් පටවා ඇති එකලස් කිරීමක් විය හැකිය. ඔබට භාවිතා කිරීමට සිදුවනු ඇත GetEntryAssembly! CodeBaseඑකලස් කිරීම GAC හි ඇති විට සැකසිය නොහැකි බව සලකන්න . වඩා හොඳ විකල්පය නම් AppDomain.CurrentDomain.BaseDirectory.
bitbonk

3
කරුණාකර අවකාශ 4 කින් කේතය ලියන්න එවිට පිටපත් කිරීම
පහසුය

4
@farosch: Applicationකොන්සෝල යෙදුම් සඳහා නොපවතී.
සෑම් ඇක්ස්

411

වත්මන් යෙදුම් නාමාවලිය ලබා ගැනීමට ඔබට පහත කේතය භාවිතා කළ හැකිය.

AppDomain.CurrentDomain.BaseDirectory

45
මෙය භාවිතා නොකරන්න. BaseDirectory ක්‍රියාත්මක වන වේලාවේදී සැකසිය හැකිය. එය නිවැරදි බවට සහතික නොවේ (පිළිගත් පිළිතුර මෙන්).
usr

3
+1 සෙවනැලි පිටපත් කිරීම සඳහා වන්දි ගෙවන බැවින් මෙය ඔබට අවශ්‍ය පිළිතුර විය හැකිය.
ජෝර්ජ් මවර්

4
rusr එය ක්‍රියාත්මක වේලාවට BaseDirectoryසැකසිය හැකි යැයි ඔබ සිතන්නේ කුමක් ද ? එය සතුව ඇත්තේ ලබා ගන්නෙකු පමණි.
bitbonk

3
@bitbonk එය appdomain නිර්මාණය කරන වේලාවේදී සැකසිය හැකිය.
usr

3
BaseDirectory * .lnk ගොනුවක, “Start in:” ක්ෂේත්‍රය තුළ වෙනස් කළ හැකි නොවේද?
ඇලෙක්සැන්ඩර්

174

යෙදුමේ නාමාවලිය සොයා ගැනීම සඳහා ඔබට විකල්ප දෙකක් තිබේ, ඔබ තෝරා ගන්නා ඔබේ අරමුණ මත රඳා පවතී.

// 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 කට වඩා
තිබේද

19
ඔබ කියූ මාර්ගය සමඟ var localDirectory = new Uri(directory).LocalPath;
යූආර්අයි

මෙය වැරදිය. ක්‍රියාත්මක කළ හැකි දේ යනු .NET එකලස් කිරීමක් නොවේද? නිවැරදි පිළිතුර නම් පරිසරය පරීක්ෂා කර විධාන රේඛාව පරීක්ෂා කිරීමයි.
ලකුණ

Uk Ukuma.Scott මාර්ගයේ & # තිබේ නම් මෙය ක්‍රියා නොකරයි
MatsW

83

බොහෝ විට ටිකක් ප්‍රමාද නමුත් මෙය සඳහන් කිරීම වටී:

Environment.GetCommandLineArgs()[0];

හෝ වඩාත් නිවැරදිව නාමාවලි මාර්ගය ලබා ගැනීම සඳහා:

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

සංස්කරණය කරන්න:

GetCommandLineArgsවැඩසටහනේ නම නැවත ලබා දීම සහතික නොවන බව බොහෝ දෙනෙක් පෙන්වා දී ඇත . විධාන රේඛාවේ පළමු වචනය බලන්න වැඩසටහනේ නම සම්මුතියෙන් පමණි . ලිපියේ සඳහන් වන්නේ “වින්ඩෝස් වැඩසටහන් ඉතා ස්වල්පයක් මෙම විකාරය භාවිතා කළත් (මම මා ගැන කිසිවක් නොදනිමි)”. එබැවින් 'කොල්ලකෑම' කළ හැකි GetCommandLineArgsනමුත් අපි කතා කරන්නේ කොන්සෝල යෙදුමක් ගැන ය. කොන්සෝල යෙදුම් සාමාන්‍යයෙන් ඉක්මන් හා අපිරිසිදු ය. එබැවින් මෙය මගේ KISS දර්ශනයට ගැලපේ.


1
ඔබ සඳහන් කරන තත්වය අතිශයින්ම න්‍යායාත්මක ය. කොන්සෝල යෙදුමක සන්දර්භය තුළ, වෙනත් ක්‍රමයක් භාවිතා කිරීම ඇත්තෙන්ම තේරුමක් නැත. එය සරලව තබා ගන්න!
ස්ටීව් මැක්

1
rusr mmm - taskmgr cmdline තීරුව දෙස බැලීමෙන් මා පවසන දෙයට උපස්ථ වේ. Exe නම සහිත පද්ධති සේවා කිහිපයක්. ගණන් ගන්න එපා. මම කියන්නට උත්සාහ කරන්නේ, කොන්සෝල යෙදුමක් සංවර්ධනය කිරීමේදී ඒවා අවශ්‍යතාවයට වඩා සංකීර්ණ කිරීමට අවශ්‍ය නොවන බවයි. විශේෂයෙන් අප සතුව දැනටමත් තොරතුරු ඇති විට. දැන්, ඔබ GetCommandLineArgs වංචා කරන ආකාරයට කොන්සෝල යෙදුමක් ධාවනය කරන්නේ නම්, ඔබ දැනටමත් වළලු හරහා පනින අතර කොන්සෝලය යෙදුමක් යනු නිවැරදි මාර්ගයද යන්න ඔබගෙන්ම විමසා බැලිය යුතුය.
ස්ටීව් මැක්

5
ඔබගේ "සරල" විසඳුමට ක්‍රම ඇමතුම් දෙකක් ඇතුළත් වේ. "සංකීර්ණ" විසඳුමට ක්‍රම ඇමතුම් දෙකක් ඇතුළත් වේ. ප්‍රායෝගික වෙනසක් නැත - ඔබ වැඩසටහන ලියන විට ඔබගේ පාලනය යටතේ නොමැති ඇතැම් තත්වයන් යටතේ “සරල” විසඳුම මඟින් ඔබට වැරදි පිළිතුරක් ලබා දිය හැකිය. අවදානම ගන්නේ ඇයි? අනෙක් ක්‍රම දෙකේ ඇමතුම් භාවිතා කරන්න, එවිට ඔබේ වැඩසටහන වඩාත් සංකීර්ණ නොවන නමුත් වඩා විශ්වාසදායක වනු ඇත.
ක්‍රිස්

3
මගේ තත්වය සඳහා වැඩ කළ අතර, අනෙක් විසඳුම් නොලැබුණි, එබැවින් වෙනත් විකල්පයක් ලබා දීම ගැන ස්තූතියි :-) මම එම්එස් ඒකක පරීක්ෂණයක් ක්‍රියාත්මක කිරීම සඳහා රීෂාර්පර් ටෙස්ට් ධාවකයෙකු භාවිතා කළ අතර මා පරීක්ෂා කරමින් සිටි කේතයට නිශ්චිත .dll ක්‍රියාත්මක කිරීමේ නාමාවලියෙහි තිබිය යුතුය. .. සහ Assembly.GetExecitingDirectory () අමුතු ලෙස වෙනස් ප්‍රති .ලයක් ලබා දෙයි.
wallismark

1
H ක්‍රිස් - මෙම පිළිතුර ආරක්ෂා කිරීමට. එය ඒකක පරීක්ෂණ සඳහා ක්‍රියා කරයි, GetEntryAsbel විසඳුම නොලැබේ, මන්ද GetEntryAsbel නැවත පැමිණේ. GetExecotingAsbel යෝජනා කරන පිළිතුරු ව්‍යාජ ඒවාය, මන්ද ඒවා ක්‍රියාත්මක කළ හැකි වන්නේ නැවත ක්‍රියාත්මක කළ හැකි එකලස් කළ හැකි නම් පමණි. මෙය සරල නොවේ, නමුත් නිවැරදි විසඳුමයි.
ලකුණ

44

Asp.net වෙබ් යෙදුම් ගැන උනන්දුවක් දක්වන ඕනෑම කෙනෙකුට. මෙන්න මගේ ක්‍රම 3 ක ප්‍රති results ල

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% ක් වූ නමුත් මට සාමාන්‍ය මාර්ගයක් වෙනුවට යූරි එකක් ආපසු ලබා දුන්නේය.

එම්එස්ඩීඑන් සංසද පෝස්ට් එකේ විස්තර කර ඇති පරිදි, යූආර්අයි මාර්ගය සාමාන්‍ය ගොනු මාර්ගයක් බවට පරිවර්තනය කරන්නේ කෙසේද? , මම පහත සඳහන් දෑ භාවිතා කළෙමි:

// 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 වින්ඩෝස් සේවාවක් නම් සහ වත්මන් නාමාවලිය C: \ Windows \ system32 ලබා දෙන්නේ නම් මෙයද හොඳින් ක්‍රියාත්මක වේ. ඉහත කේතය exe හි නියම ස්ථානය ලබා දෙයි
DaImTo

ඔබ එවැනි දෙයක් කිරීමට උත්සාහ කළහොත් හැර File.CreateDirectory(path), එය ඔබට
යූආර්අයි

1
අවාසනාවට මෙය කොටස් හඳුනාගැනීමක් ( #චරිතය) අඩංගු මාර්ග සඳහා ක්‍රියා නොකරයි . හඳුනාගැනීමේ යන්ත්‍රය සහ එය අනුගමනය කරන සෑම දෙයක්ම ප්‍රති ing ල මාර්ගයෙන් කපා දමනු ලැබේ.
bgfvdu3w

ඇයි ඔබ හුවමාරු නැහැ new Uriහා System.IO.Path.GetDirectoryName? එය ඔබට a වෙනුවට සාමාන්‍ය මාර්ග නූලක් ලබා දෙයි Uri.
ටිමෝ

මම මෙය හොඳම එකක් ලෙස සලකමි. මෙම ප්රවේශය ඕනෑම පරිසරයක මට විශ්වාසදායක ලෙස ක්රියා කර ඇත. නිෂ්පාදනයේදී, දේශීයව නිදොස්කරණය, ඒකක පරීක්ෂාව ... ඒකක පරීක්ෂණයකදී ඔබ ඇතුළත් කළ අන්තර්ගත ගොනුවක් ("අන්තර්ගතය - අලුත් නම් පිටපත් කරන්න") විවෘත කිරීමට අවශ්‍යද? එය තියෙනවා.
ටිමෝ

29

ඔබ මෙය කිරීමට බලාපොරොත්තු විය හැකිය:

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

25

ඔබ .NET Core අනුකූල ක්‍රමයක් සොයන්නේ නම්, භාවිතා කරන්න

System.AppContext.BaseDirectory

මෙය .NET Framework 4.6 සහ .NET Core 1.0 (සහ .NET Standard 1.3) වලින් හඳුන්වා දෙන ලදී. බලන්න: AppContext.BaseDirectory Property .

මෙම පිටුවට අනුව ,

.NET Core හි AppDomain.CurrentDomain.BaseDirectory සඳහා වඩාත් සුදුසු ආදේශනය මෙයයි


1
ස්වයං අන්තර්ගත ඩොට්නෙට් කොන්සෝල යෙදුම් සඳහා github.com/dotnet/runtime/issues/13051 ද බලන්න . මෙහි නිර්දේශය භාවිතා කිරීමProcess.GetCurrentProcess().MainModule.FileName
ගේවින්

24

ඔබට ඒ වෙනුවට මෙය භාවිතා කළ හැකිය.

System.Environment.CurrentDirectory

මෙය ක්‍රියාත්මක කළ හැකි ෆෝල්ඩරය ලැබෙනු ඇත
ඉයන්

මෙය ක්‍රම ගණනාවකින් වෙනස් කළ හැකිය (කෙටිමං සැකසුම් ආදිය) ... එය භාවිතා නොකිරීමට වඩා හොඳය.
යූෂා අලෙයූබ්

19

කොන්සෝල යෙදුම් සඳහා, ඔබට මෙය උත්සාහ කළ හැකිය:

System.IO.Directory.GetCurrentDirectory();

ප්‍රතිදානය (මගේ දේශීය යන්ත්‍රයේ):

c: \ පරිශීලකයින් \ xxxxxxx \ ලේඛන \ දෘශ්‍ය චිත්‍රාගාරය 2012 \ ව්‍යාපෘති \ ImageHandler \ GetDir \ bin \ නිදොස්කරණය

නැතහොත් ඔබට උත්සාහ කළ හැකිය (අවසානයේ අමතර බැක්ස්ලෑෂ් එකක් ඇත):

AppDomain.CurrentDomain.BaseDirectory

ප්‍රතිදානය:

c: \ පරිශීලකයින් \ xxxxxxx \ ලේඛන \ දෘශ්‍ය චිත්‍රාගාරය 2012 \ ව්‍යාපෘති \ ImageHandler \ GetDir \ bin \ Debug \


" BaseDirectoryක්‍රියාත්මක වන වේලාවේදී එය සැකසිය හැකිය. එය නිවැරදි බවට සහතික නොවේ"
යූෂා ඇලෙයූබ්


9

ඔබට ඔබේ ව්‍යාපෘති යොමු කිරීම් වලට එකතු කර සුපුරුදු පරිදි System.Windows.Formsභාවිතා කළ System.Windows.Forms.Application.StartupPathහැකිය.

එබැවින්, වඩාත් සංකීර්ණ ක්රම හෝ පරාවර්තනය භාවිතා කිරීම අවශ්ය නොවේ.


මම එය භාවිතා කළ අතර එය හොඳින් ක්‍රියාත්මක වේ. නමුත් එක් වරක් මම මගේ ඒකක පරීක්ෂණ ව්‍යාපෘතියේ එය භාවිතා කළ ක්‍රමය භාවිතා කළෙමි. ඇත්ත වශයෙන්ම, එය C: \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 14.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW
ainasiart

@ainasiart ඉතින් ඒකක පරීක්ෂණ අතරතුර මෙය ක්‍රියාත්මක කරන්නේ කෙසේද ??
නිකලස් සිග්මන්ඩ්

9

පහත දැක්වෙන පේළිය මඟින් ඔබට යෙදුම් මාර්ගයක් ලබා දෙනු ඇත:

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

ඉහත විසඳුම පහත සඳහන් අවස්ථාවන්හිදී නිසි ලෙස ක්‍රියාත්මක වේ:

  • සරල යෙදුම
  • Assembly.GetEntryAsbel () අහෝසි වන වෙනත් වසමක
  • කාවැද්දූ සම්පත් වලින් ඩීඑල්එල් බයිට් අරාවක් ලෙස පටවා ඇප් ඩොමේන් වෙත එකලස් කිරීමක් ලෙස පටවනු ලැබේ.
  • මොනෝගේ mkbundleමිටි සමඟ (වෙනත් ක්‍රම ක්‍රියාත්මක නොවේ)

ලිනක්ස් හි නිදොස්කරණය යටතේ මෙය නැවත පැමිණේ: / usr / share / dotnet
ව්ලැඩිමීර්

7

මම මෙය භාවිතා කරන්නේ exe දෙවරක් ක්ලික් කිරීමෙන් කැඳවිය යුතු නම්

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

5
ඔබට අහඹු නාමාවලි ලබා ගත හැකි නිසා මෙය නිවැරදි නොවේ.
amuliar

මෙම විධානය මඟින් Environment.CurrentDirectory නැවත ලබා දෙන අතර එය ඕනෑම වේලාවක ධාවන වේලාවට වෙනස් කළ හැකිය, එබැවින් එය විශ්වාසදායක විසඳුමක් නොවේ.
යූරි කොස්ලොව්

7

මම භාවිතා කර ඇත

System.AppDomain.CurrentDomain.BaseDirectory

යෙදුම් ෆෝල්ඩරයකට සාපේක්ෂව මාර්ගයක් සොයා ගැනීමට මට අවශ්‍ය වූ විට. මෙය ASP.Net සහ winform යෙදුම් සඳහා ක්‍රියා කරයි. එයට System.Web එකලස් කිරීම් පිළිබඳ කිසිදු සඳහනක් අවශ්‍ය නොවේ.


6

මම කිව්වේ, ඇයි ap / invoke method?

    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
මේ සඳහා .NET විශාල ප්‍රමාණයක් ඇති විට p / invoke ඇයි?
මහාචාර්ය

7
35 user3596865 එය වින්ඩෝස් වෙත දැඩි ලෙස යැපීම අවශ්‍ය වන අතර එය ඩීඑන්එක්ස් හෝ මොනෝ සමඟ නොගැලපේ. සමහර විට අනාගත වින්ඩෝස් අනුවාදවල කැපී පෙනෙන වෙනසක් සිදුවිය හැකිය. ඉතින් නැවතත්: ඇයි අපි මෙහි පින්වෝක් භාවිතා කළ යුත්තේ?
බෙන්

5

Assembly.GetEntryAssembly().Location හෝ Assembly.GetExecutingAssembly().Location

System.IO.Path.GetDirectoryName()නාමාවලිය පමණක් ලබා ගැනීම සඳහා ඒකාබද්ධව භාවිතා කරන්න .

සිට මාර්ග GetEntryAssembly()හා GetExecutingAssembly()බොහෝ අවස්ථාවල සඳහා බහලුම සමාන වනු ඇත වුවද, වෙනස් විය හැක.

සමග GetEntryAssembly()ඔබට මෙම නැවත හැකි බව දැනුවත් විය යුතුය nullපිවිසුම් මොඩියුලය කළමනාකරණය නොකළ (එනම් C ++ හෝ VB6 ක්රියාත්මක) නම්. එවැනි අවස්ථාවන්හිදී GetModuleFileNameWin32 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

මා වෙනුවෙන් වැඩ කරයි (යෙදුම් වර්ගය: පන්ති පුස්තකාලය). C # ගැන විශ්වාස නැත ... w / o ගොනු නාමය string ලෙස ලබා දෙයි


4
AppDomain.CurrentDomain.BaseDirectory

ස්ථාපන පැකේජ සමඟ තෙවන පාර්ශවීය යොමු ලිපිගොනු යොමු කිරීම සඳහා ගැටළුව විසඳනු ඇත.


11
මෙම පිළිතුර මීට වසර 5 කට පෙර දැනටමත් යෝජනා කර ඇත, එක් වරකට වඩා.
පීඑල්

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) + @"\";
    }
}

2

මෙම සරල කේත රේඛාව උත්සාහ කරන්න:

 string exePath = Path.GetDirectoryName( Application.ExecutablePath);

1

.නෙට් කෝර් පරාවර්තනය භාවිතා කළ හැකි පද්ධතියක් බවට කිසිවෙකු පරිවර්තනය කරන බවක් මා දුටුවේ නැත. අයිඕ මාවත මෙන්න මගේ අනුවාදය.

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

   return new FileInfo(exePath).DirectoryName;

}

මෙය ඔබගේ කේතය ඇති තැනට සම්පූර්ණ "C: \ xxx \ xxx" ආකෘතිගත මාර්ගය ලබා දෙනු ඇත.


1

තවත් විසඳුමක් වන්නේ වත්මන් මාර්ගයට යොමු වන සාපේක්ෂ මාර්ග භාවිතා කිරීමයි:

Path.GetFullPath(".")

මෙය වත්මන් ඩිරෙක්ටරිය ලබා ගනී, ආරම්භක EXE හි පිහිටීම නොවේ.
tenfour

0

Path.GetDirectoryName (System.Diagnostics.Process.GetCurrentProcess (). MainModule.FileName) මා උත්සාහ කළ සෑම අවස්ථාවකම මා වෙනුවෙන් වැඩ කළ එකම එක එයයි.


-1

32bit සහ 64bit යෙදුම් සමඟ ක්‍රියා කරන විශ්වාසදායක විසඳුමක් මෙන්න .

මෙම යොමු එකතු කරන්න:

System.Diagnostics භාවිතා කිරීම;

System.Management භාවිතා කිරීම;

ඔබේ ව්‍යාපෘතියට මෙම ක්‍රමය එක් කරන්න:

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);

ක්‍රියාවලියේ හැඳුනුම්පත ඔබ දන්නේ නම්, මෙම ක්‍රමය මඟින් අනුරූපී ක්‍රියාත්මක කිරීමේ මාර්ගය නැවත ලබා දෙන බව සලකන්න.

අමතර, උනන්දුවක් දක්වන අය සඳහා:

Process.GetProcesses() 

... දැනට ක්‍රියාත්මක වන සියලුම ක්‍රියාවලීන් සමූහයක් ඔබට ලබා දෙනු ඇත, සහ ...

Process.GetCurrentProcess()

... ඔවුන්ගේ තොරතුරු සමඟ වර්තමාන ක්‍රියාවලිය ඔබට ලබා දෙනු ඇත. උදා: හැඳුනුම්පත් යනාදිය සහ සීමිත පාලනයක් උදා.


-2

ක්‍රියාත්මක කළ හැකි මාර්ගයක් ලබා ගැනීමට බොහෝ ක්‍රම තිබේ, අප එය භාවිතා කළ යුත්තේ අපගේ අවශ්‍යතා මත ය. මෙහි විවිධ ක්‍රම සාකච්ඡා කරන සබැඳියකි.

අයදුම්පත් ක්‍රියාත්මක කළ හැකි මාර්ගය ලබා ගැනීමට විවිධ ක්‍රම


1
FYI: ක්ලික් කළ විට සබැඳිය තර්ජනාත්මක අනතුරු ඇඟවීමක් පෙන්වයි.
ග්‍රෙගරි විලියම් බ්‍රයන්ට්

-5

සොලියුෂන් එක්ස්ප්ලෝරර් භාවිතයෙන් ඔබට ව්‍යාපෘතිය තුළ සම්පත් ලෙස ෆෝල්ඩර නාමයක් සෑදිය හැකිය, එවිට ඔබට සම්පත් තුළ ගොනුවක් ඇලවිය හැකිය.

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.