.NET কনসোল অ্যাপ্লিকেশনটিতে আমি কীভাবে অ্যাপ্লিকেশনটির পাথ পেতে পারি?


951

কনসোল অ্যাপ্লিকেশনটিতে আমি কীভাবে অ্যাপ্লিকেশনটির সন্ধান করব?

ভিতরে উইন্ডোজ ফরম , আমি ব্যবহার করতে পারেন Application.StartupPathবর্তমান পথ খুঁজে পেতে, কিন্তু এই একটি কনসোল অ্যাপ্লিকেশন পাওয়া যাবে বলে মনে হচ্ছে না।


5
আপনি লক্ষ্য (ক্লায়েন্ট, উন্নয়ন) মেশিনে .NET ফ্রেমওয়ার্ক ইনস্টল করবেন? যদি আপনার উত্তরটি সত্য হয়; সুতরাং, আপনি System.Windows. Forms.dll এ একটি রেফারেন্স যুক্ত করতে পারেন এবং অ্যাপ্লিকেশন.স্টার্টআপপথটি ব্যবহার করতে পারেন! আপনি যদি ভবিষ্যতের ব্যতিক্রমগুলি বাদ দিতে চান তবে এটিই সেরা উপায়!
এহসান মোহাম্মদী

অ্যাপডোমাইন.বেস ডিরেক্টরীটি অ্যাপ ডিরেক্টরি directory সচেতন হোন যে অ্যাপ্লিকেশনটি ভিএস এনভ এবং উইন এনভির মধ্যে আলাদা আচরণ করতে পারে। তবে অ্যাপডোমাইনটি অ্যাপ্লিকেশন.পথের মতো নয় তবে আমি আশা করি এটি কেবল আইআইএসের জন্যই নয়।
Mertuarez

উত্তর:


1178

System.Reflection.Assembly.GetExecutingAssembly()Location1

System.IO.Path.GetDirectoryNameআপনি যদি চান ডিরেক্টরি এটি একত্রিত ।

1 মিঃ মিনডোরের মতামত অনুসারে: কার্যনির্বাহী সমাবেশটি
System.Reflection.Assembly.GetExecutingAssembly().Location যেখানে অবস্থিত সেখানে প্রত্যাবর্তন করে, যা কার্যকর না করার সময় অ্যাসেম্বলির অবস্থান যেখানে থাকতে পারে বা নাও হতে পারে। ছায়া অনুলিপি সমাবেশগুলির ক্ষেত্রে, আপনি একটি অস্থায়ী ডিরেক্টরিতে একটি পাথ পাবেন। System.Reflection.Assembly.GetExecutingAssembly().CodeBaseসমাবেশের 'স্থায়ী' পথ ফিরিয়ে দেবে।


243
System.Reflection.Assembly.GetExecutingAssembly () অবস্থান আয় যেখানে সমাবেশ নির্বাহ করা হয়। বর্তমানে অবস্থিত, যা অথবা যেখানে সমাবেশ অবস্থিত যখন না নির্বাহ হতে পারে। ছায়া অনুলিপি সমাবেশগুলির ক্ষেত্রে, আপনি একটি অস্থায়ী ডিরেক্টরিতে একটি পাথ পাবেন। সিস্টেম.আরফ্লেশন.অ্যাস্পলেশন.গেট এক্সেকিউটিংঅ্যাস্পাব্যাশন ()। কোডবেস বিধানসভাটির ' বেপরোয়া ' পথ ফিরিয়ে দেবে ।
মিঃমিন্দর

13
@SamGoldberg: তা কিভাবে এটি ব্যবহার করা হয় উপর নির্ভর করে: stackoverflow.com/q/1068420/391656 । বা আপনি করতে পারেন ... নতুন উরি (সিস্টেম.প্রকাশন.অ্যাসাব্লুশন.গেটএক্সেকিউটিংঅ্যাস্পাব্যাশন ()। কোডবেস) .লোকপথ
মিঃমিন্ডর

28
GetExecutingAssemblyসমাবেশ কার্যকর করে যা বর্তমানে কার্যকর করা কোডটি ধারণ করে । এটি অগত্যা কনসোল .exe সমাবেশ হতে পারে না । এটি এমন কোনও সমাবেশ হতে পারে যা সম্পূর্ণ আলাদা অবস্থান থেকে লোড করা হয়েছে। আপনি ব্যবহার করতে হবে GetEntryAssembly! এছাড়াও নোট করুন যে CodeBaseসমাবেশটি যখন জিএসি-তে থাকে তখন সেট করা নাও যেতে পারে। আরও ভাল বিকল্প AppDomain.CurrentDomain.BaseDirectory
বিটবঙ্ক

3
দয়া করে 4 স্পেসে কোড লিখুন যাতে অনুলিপি করা যায়
fnc12

3
আপনি যদি dll, System.Rਫલેક્શન.অ্যাস্পলেশন.গেটএক্সেকিউটিংএ্যাস্পাবল () কল করেন। কোডবেজ "ফাইল: /// সি: / উইন্ডোজ / মাইক্রোসফটস.এনইটি / ফ্রেমওয়ার্ক 64/v4.0.30319/mscorlib.dll"
রাইডসান

407

আপনি বর্তমান অ্যাপ্লিকেশন ডিরেক্টরি পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

AppDomain.CurrentDomain.BaseDirectory

42
এটি ব্যবহার করবেন না। বেসডাইরেক্টরি রানটাইমে সেট করা যায়। এটি সঠিক হওয়ার গ্যারান্টিযুক্ত নয় (যেমন স্বীকৃত উত্তরটি হয়)।
usr ডিরেক্টরির

3
+1 এটি ছায়া অনুলিপি জন্য ক্ষতিপূরণ হিসাবে আপনি সম্ভবত উত্তর চান।
জর্জ মাউয়ার

4
@ ইউএসআর আপনাকে কী মনে করে যে BaseDirectoryরানটাইম এ সেট করা যেতে পারে? এটির জন্য কেবল একজন গেটর রয়েছে।
বিটবঙ্ক

3
@ বিটবোনক এটি অ্যাপডোমেন তৈরির সময় সেট করা যেতে পারে।
usr

3
"স্টার্ট ইন:" ফিল্ডে, বেসডাইরেক্টরিটি * .lnk ফাইলে পরিবর্তন করা যায় না?
আলেকজান্ডার

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
শুধু বলতে চেয়েছিলেন, স্পষ্টতই আরও কতগুলি বিকল্প রয়েছে যে আরও কতগুলি পছন্দ পোস্ট করা হয়েছে ...
vapcguy

17
যদি আপনি যে পথটির সাথে যা করার চেষ্টা করছেন তা ইউআরআই ফর্ম্যাটকে সমর্থন করে না, ব্যবহার করুনvar localDirectory = new Uri(directory).LocalPath;
স্কট সোলার

এটা ঠিক ভুল। কার্যনির্বাহী কী কোনটিই নেট নেট সমাবেশ নয়? সঠিক উত্তরটি হল পরিবেশ পরীক্ষা করা এবং কমান্ড লাইনটি পরিদর্শন করা।
চিহ্নিত করুন

@ Ukuma.Scott এই পথটি রয়েছে & অথবা # যদি কাজ না করে
MatsW

82

সম্ভবত কিছুটা দেরি হলেও এটি উল্লেখ করার মতো:

Environment.GetCommandLineArgs()[0];

বা আরও সঠিকভাবে কেবল ডিরেক্টরি পাথ পেতে:

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

সম্পাদনা:

বেশ কিছু লোক উল্লেখ করেছে যে GetCommandLineArgsপ্রোগ্রামটির নাম ফেরত দেওয়ার গ্যারান্টিযুক্ত নয়। দেখুন কমান্ড লাইনের প্রথম শব্দটি কেবল কনভেনশন দ্বারা প্রোগ্রামের নাম । নিবন্ধটিতে উল্লেখ করা হয়েছে যে "যদিও খুব কম উইন্ডোজ প্রোগ্রাম এই কৌতুক ব্যবহার করে (আমি নিজের সম্পর্কে অবগত নই)"। সুতরাং 'স্পুফ' করা সম্ভব GetCommandLineArgs, তবে আমরা একটি কনসোল অ্যাপ্লিকেশন সম্পর্কে কথা বলছি। কনসোল অ্যাপ্লিকেশনগুলি সাধারণত দ্রুত এবং নোংরা হয়। সুতরাং এটি আমার KISS দর্শনের সাথে খাপ খায়।


1
@ আপনি যে পরিস্থিতিটির প্রতিশ্রুতি দিয়েছেন তা অত্যন্ত তাত্ত্বিক @ কোন কনসোল অ্যাপ্লিকেশন প্রসঙ্গে, অন্য কোনও পদ্ধতি ব্যবহার করা সত্যিকার অর্থে তা বোঝায় না। সহজবোধ্য রাখো!
স্টিভ ম্যাক

1
@ আরএসএম মিমি - আমি যা বলছি তা ব্যাক আপ করার জন্য টাস্কমিমার সেমিডলাইন কলামের সন্ধান করুন। কেবল এক্সি নাম সহ কয়েকটি সিস্টেম পরিষেবা। কিছু মনে করো না. আমি যা বলতে চাইছি তা হ'ল কোনও কনসোল অ্যাপ্লিকেশন বিকাশ করার সময় জিনিসগুলি যতটা প্রয়োজন ঠিক তত বেশি জটিল করার দরকার নেই। বিশেষত যখন আমাদের কাছে ইতিমধ্যে তথ্য উপলব্ধ থাকে। এখন, আপনি যদি গেটকম্যান্ডলাইনআরগ্সকে চালিত করার মতো কোনও কনসোল অ্যাপ্লিকেশন চালিয়ে যাচ্ছেন তবে আপনি ইতিমধ্যে হুপসের মধ্য দিয়ে ঝাঁপিয়ে পড়েছেন এবং কোনও কনসোল অ্যাপ্লিকেশনটি সঠিক পথে যাওয়ার জন্য আপনার নিজের নিজেকে জিজ্ঞাসা করতে হবে।
স্টিভ ম্যাক

5
আপনার "সহজ" সমাধানটিতে দুটি পদ্ধতি কল জড়িত। "জটিল" সমাধানটিতে দুটি পদ্ধতি কল জড়িত। কোনও ব্যবহারিক পার্থক্য নেই - আপনি "প্রোগ্রাম" লেখার সময় "সাধারণ" সমাধান আপনাকে নির্দিষ্ট পরিস্থিতিতে ভুল উত্তর দিতে পারে যা আপনার নিয়ন্ত্রণে নেই। ঝুঁকি নিলেন কেন? অন্য দুটি পদ্ধতি কলগুলি ব্যবহার করুন এবং আপনার প্রোগ্রামটি আরও জটিল হবে না তবে এটি আরও নির্ভরযোগ্য হবে।
ক্রিস

3
আমার দৃশ্যের জন্য কাজ করে, অন্যান্য সমাধানগুলি তা করেনি, সুতরাং অন্য বিকল্পটি সরবরাহ করার জন্য ধন্যবাদ :-) আমি একটি এমএস ইউনিট পরীক্ষা চালানোর জন্য রিসার্পার টেস্ট রানার ব্যবহার করছিলাম এবং কোডটি আমি পরীক্ষা করে যাচ্ছিলাম নির্বাহী ডিরেক্টরিতে থাকতে একটি নির্দিষ্ট .dll প্রয়োজন। .. এবং এসেম্বলি.গেটএক্সেকিউটিংডাইরেক্টরি () অদ্ভুতভাবে একটি আলাদা ফলাফল দেয়।
দেয়ালমার্ক 6

1
@ ক্রিস - এই উত্তরটির প্রতিরক্ষা করতে। এটি ইউনিট পরীক্ষাগুলির জন্য কাজ করে, GetEntryAsorses সমাধানটি করে না, কারণ getEntryAsorses নালার প্রত্যাবর্তন করে। গেটএক্সেকিউটিংএস্প্যাশনের প্রস্তাব দেওয়া উত্তরগুলি বোগাস, কারণ তারা কেবলমাত্র এক্সিকিউটিভকে ফিরিয়ে দেয় যদি এক্সিকিউটিভ অ্যাসেমব্লিকে এক্সিকিউটেবল হয়। এটি সহজ নয়, তবে সঠিক সমাধান।
চিহ্নিত করুন

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

অ্যাপ্লিকেশনটি শারীরিকভাবে "সি: et ইনপপ SP এসবিস্পোর্টাল_স্টেজিং" থেকে চলছে, সুতরাং প্রথম অ্যাপ্লিকেশনটি অবশ্যই ওয়েব অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত নয়।


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
যদি প্রশ্নে থাকা এক্সিটি একটি উইন্ডোজ পরিষেবা এবং বর্তমান ডিরেক্টরিটি সি: \ উইন্ডোজ \ system32 দেয় তবে এটিও ভাল কাজ করে। উপরের কোডটি
এক্সের

এরপরে যদি আপনি এর মতো কিছু করার চেষ্টা করেন তবে File.CreateDirectory(path)এটি আপনাকে ব্যতিক্রম দেয় যে এটি ইউআরআই
পথগুলিকে

1
দুর্ভাগ্যক্রমে এটি এমন পাথগুলির জন্য কাজ করে না যাতে একটি খণ্ড সনাক্তকারী ( #চরিত্র) থাকে। সনাক্তকারী এবং এর অনুসরণকারী সমস্ত কিছুই ফলাফলের পথ থেকে কেটে ফেলা হয়েছে।
bgfvdu3w

কেন আপনি অদলবদল new Uriএবং না System.IO.Path.GetDirectoryName? এটি আপনাকে একটি এর পরিবর্তে একটি সাধারণ পাথ স্ট্রিং দেয় Uri
টিমো

আমি এটি সেরা খুঁজে। এই একই পদ্ধতির কোনও পরিবেশে আমার জন্য নির্ভরযোগ্যভাবে কাজ করেছে। উত্পাদনে, স্থানীয়ভাবে ডিবাগিং, ইউনিট পরীক্ষার ... একটি ইউনিট পরীক্ষায় আপনি অন্তর্ভুক্ত এমন কোনও সামগ্রী ফাইল খুলতে চান ("বিষয়বস্তু - কপি আরও নতুন")? এটা ওইখানে.
টিমো

29

আপনি এটি করতে খুঁজছেন হতে পারে:

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

23

পরিবর্তে আপনি এটি ব্যবহার করতে পারেন।

System.Environment.CurrentDirectory

এটি এক্সিকিউটেবলের ফোল্ডারটি পাবেন যদিও
আইয়েন

এটি বিভিন্ন উপায়ে পরিবর্তন করা যেতে পারে (শর্টকাট সেটিংস ইত্যাদি) ... এটি ব্যবহার না করাই ভাল।
ইউশা আলেয়াউব

23

আপনি যদি একটি নেট কোর সামঞ্জস্যপূর্ণ উপায় খুঁজছেন, ব্যবহার করুন

System.AppContext.BaseDirectory

এটি নেট ফ্রেমওয়ার্ক 4.6 এবং। নেট কোর 1.0 (এবং। নেট স্ট্যান্ডার্ড 1.3) এ প্রবর্তিত হয়েছিল। দেখুন: AppContext.BaseD ডিরেক্টরী সম্পত্তি

এই পৃষ্ঠা অনুসারে ,

এটি নেট কোরে অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডাইরেক্টরির জন্য পছন্দসই প্রতিস্থাপন


স্ব-অন্তর্ভুক্ত ডটনেট কনসোল অ্যাপ্লিকেশনগুলির জন্য github.com/dotnet/runtime/issues/13051 দেখুন । এখানে সুপারিশটি ব্যবহার করতে হবেProcess.GetCurrentProcess().MainModule.FileName
গাভিন

19

কনসোল অ্যাপ্লিকেশনগুলির জন্য, আপনি এটি ব্যবহার করতে পারেন:

System.IO.Directory.GetCurrentDirectory();

আউটপুট (আমার স্থানীয় মেশিনে):

সি: \ ব্যবহারকারীগণ \ এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স \ ডকুমেন্টস \ ভিজ্যুয়াল স্টুডিও 2012 \ প্রকল্পগুলি \ ইমেজহ্যান্ডলার \ গেটডির \ বিন \ ডিবাগ

অথবা আপনি চেষ্টা করতে পারেন (শেষ পর্যন্ত একটি অতিরিক্ত ব্যাকস্ল্যাশ রয়েছে):

AppDomain.CurrentDomain.BaseDirectory

আউটপুট:

সি: \ ব্যবহারকারীগণ \ এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স \ ডকুমেন্টস \ ভিজ্যুয়াল স্টুডিও 2012 \ প্রকল্পগুলি \ ইমেজহ্যান্ডলার \ গেটডির \ বিন \ ডিবাগ \


" BaseDirectoryরানটাইমে সেট করা যেতে পারে। এটি সঠিক হওয়ার গ্যারান্টিযুক্ত নয়"
ইউশা আলেয়ুব


9

আপনি কেবল আপনার প্রকল্পের রেফারেন্সগুলিতে যুক্ত করতে System.Windows.Formsপারেন এবং তারপরে System.Windows.Forms.Application.StartupPath যথারীতি ব্যবহার করতে পারেন ।

সুতরাং, আরও জটিল পদ্ধতি বা প্রতিবিম্ব ব্যবহার করার প্রয়োজন নেই।


আমি এটি ব্যবহার করেছি এবং এটি ভালভাবে কাজ করে। তবে একসময় আমি আমার ইউনিট পরীক্ষা প্রকল্পে এটি ব্যবহার করার পদ্ধতিটি ব্যবহার করেছি। এবং অবশ্যই এটি ব্যর্থ হয়েছে কারণ এটি আমার ফাইলটি সি: \ প্রোগ্রাম ফাইল (X86) \ মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 14.0 \ মন্তব্য \ আইডি \ সম্প্রদায়ের
মাইক্রোসফ্ট

@ আইনসিয়ার্ট তাই ইউনিট পরীক্ষার সময় আমি কীভাবে এটি কাজ করতে পারি ??
নিকোলাস সিগমুন্ড্ট

7

আমি এটি ব্যবহার করে যদি এক্সিকে ডাবল ক্লিক করে কল করার কথা বলা হয়

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

5
এটি সঠিক নয় কারণ আপনি ফলস্বরূপ এলোমেলো ডিরেক্টরি পেতে পারেন।
amuliar

এই কমান্ডটি পরিবেশ.কন্ট্রন ডিরেক্টরীটি ফিরিয়ে দেয়, যা রানটাইম সময়ে যে কোনও পথে পরিবর্তিত হতে পারে, সুতরাং এটি নির্ভরযোগ্য সমাধান নয়।
ইউরি কোজলভ

7

আমি ব্যবহার করেছি

System.AppDomain.CurrentDomain.BaseDirectory

যখন আমি কোনও অ্যাপ্লিকেশন ফোল্ডারের সাথে সম্পর্কিত কোনও পাথ খুঁজতে চাই। এটি এএসপি. নেট এবং উইনফর্ম অ্যাপ্লিকেশন উভয়ের পক্ষে কাজ করে। এটির জন্য সিস্টেম.ওয়েব অ্যাসেম্বলিগুলির কোনও রেফারেন্সের প্রয়োজন হয় না।


7

নিম্নলিখিত লাইনটি আপনাকে একটি অ্যাপ্লিকেশন পাথ দেবে:

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

উপরের সমাধানটি নিম্নলিখিত পরিস্থিতিতে সঠিকভাবে কাজ করছে:

  • সহজ অ্যাপ্লিকেশন
  • অন্য একটি ডোমেনে যেখানে সমাবেশ.GetEntryAssembly () বাতিল হবে
  • ডিএলএল এম্বেডড রিসোর্স থেকে বাইট অ্যারে হিসাবে লোড করা হয় এবং অ্যাপডোমেনকে এসেম্বলি হিসাবে লোড করা হয় (বাইটআরআরিওফ্যামবেডডেল)
  • মনো এর mkbundleবান্ডিল সহ (অন্য কোনও পদ্ধতি কাজ করে না)

লিনাক্সে ডিবাগারের আওতায় এটি ফিরে আসে: / usr / share / dotnet
ভ্লাদিমির

6

মানে, এপি / ইনোভের পদ্ধতিটি কেন নয়?

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

আপনি এটি ঠিক প্রয়োগের মতোই ব্যবহার করবেন art স্টার্টআপপথ:

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

2
কেন এত বেশি নেট আছে যখন পি / ডাকে?
অধ্যাপক

7
@ ব্যবহারকারীর 3596865 কারণ এটি উইন্ডোজে একটি শক্ত নির্ভরতার দাবি করে এবং এটি ডিএনএক্স বা মনোোর সাথে সামঞ্জস্যপূর্ণ নয়। এবং ভবিষ্যতে উইন্ডোজ ভার্সনগুলির একটি ব্রেকিং পরিবর্তন হতে পারে। সুতরাং আবার: কেন আমাদের এখানে পিনভোক ব্যবহার করা উচিত?
বেন

5

Assembly.GetEntryAssembly().Location অথবা Assembly.GetExecutingAssembly().Location

System.IO.Path.GetDirectoryName()শুধুমাত্র ডিরেক্টরি পেতে মিশ্রণে ব্যবহার করুন ।

এর দিকগুলি GetEntryAssembly()GetExecutingAssembly()হতে পারে ভিন্ন, যদিও বেশিরভাগ ক্ষেত্রে ডিরেক্টরি একই থাকে।

আপনার সাথে GetEntryAssembly()সচেতন হতে হবে যে nullএন্ট্রি মডিউলটি পরিচালনা না করা হলে (যেমন সি ++ বা ভিবি 6 এক্সিকিউটেবল) এটি ফিরে আসতে পারে । এই ক্ষেত্রে GetModuleFileNameউইন 32 এপিআই থেকে ব্যবহার করা সম্ভব :

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

5

ভিবি.নেটে

My.Application.Info.DirectoryPath

আমার জন্য কাজ করে (অ্যাপ্লিকেশন ধরণ: শ্রেণি পাঠাগার)। সি # সম্পর্কে নিশ্চিত নন ... স্ট্রিং হিসাবে w / o ফাইলের নামটি ফেরত দেয়


4
AppDomain.CurrentDomain.BaseDirectory

ইনস্টলেশন প্যাকেজ সহ তৃতীয় পক্ষের রেফারেন্স ফাইলগুলি উল্লেখ করার জন্য সমস্যাটি সমাধান করবে।


11
এই উত্তরটি ইতিমধ্যে 5 বছরেরও আগে একাধিকবার প্রস্তাব দেওয়া হয়েছিল।
পিএল

2

এগুলির কোনও পদ্ধতিই বিশেষ ক্ষেত্রে প্রতীকী লিঙ্কটি ব্যবহারের মতো বিশেষ ক্ষেত্রে কাজ করে না, তারা লিঙ্কটির অবস্থানটি আসল exeকিতে নয় return

সুতরাং এটি পেতে কুইরিফুলপ্রসেসআইমেজ নামটি ব্যবহার করতে পারেন :

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

আর একটি সমাধান বর্তমান পাথের দিকে নির্দেশ করে আপেক্ষিক পথগুলি ব্যবহার করছে:

Path.GetFullPath(".")

এটি বর্তমান ডিরেক্টরি পায়, প্রারম্ভিক EXE এর অবস্থান নয়।
দশ মিনিট

0

। নেট কোর প্রতিবিম্বটি একটি ব্যবহারযোগ্য সিস্টেমে রূপান্তর করতে দেখলাম না I

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

   return new FileInfo(exePath).DirectoryName;

}

এটি আপনার কোডটি যেখানে রয়েছে সেখানে পূর্ণ "সি: \ xxx \ xxx" ফর্ম্যাট পথটি ফিরিয়ে দেবে।


0

এক্সিকিউটেবল পাথ পাওয়ার অনেকগুলি উপায় রয়েছে, যা আমাদের এটি ব্যবহার করা উচিত এটি আমাদের প্রয়োজনগুলির উপর নির্ভর করে একটি লিঙ্ক যা বিভিন্ন পদ্ধতি নিয়ে আলোচনা করে।

অ্যাপ্লিকেশন এক্সিকিউটেবল পাথ পাওয়ার বিভিন্ন উপায়


-1

এখানে একটি নির্ভরযোগ্য সমাধান যা 32 বিট এবং 64 বিটের সাথে কাজ করে অ্যাপ্লিকেশনগুলির ।

এই উল্লেখগুলি যুক্ত করুন:

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

... তাদের তথ্য যেমন আইডি ইত্যাদি সহ আপনাকে বর্তমান প্রক্রিয়াটি দেবে এবং সীমিত নিয়ন্ত্রণ যেমন কিল ইত্যাদি *


-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
এনভায়রনমেন্ট.কন্টেনডরেক্টরি ব্যবহার করা খুব ভুল, এটি ব্যবহার করবেন না! রানটাইম এ এই পথটি পরিবর্তন হতে পারে। এমনকি শুরুতে এটি অ-সং-বিরোধী।
usr ডিরেক্টরির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.