কনসোল অ্যাপ্লিকেশনটিতে আমি কীভাবে অ্যাপ্লিকেশনটির সন্ধান করব?
ভিতরে উইন্ডোজ ফরম , আমি ব্যবহার করতে পারেন Application.StartupPath
বর্তমান পথ খুঁজে পেতে, কিন্তু এই একটি কনসোল অ্যাপ্লিকেশন পাওয়া যাবে বলে মনে হচ্ছে না।
কনসোল অ্যাপ্লিকেশনটিতে আমি কীভাবে অ্যাপ্লিকেশনটির সন্ধান করব?
ভিতরে উইন্ডোজ ফরম , আমি ব্যবহার করতে পারেন Application.StartupPath
বর্তমান পথ খুঁজে পেতে, কিন্তু এই একটি কনসোল অ্যাপ্লিকেশন পাওয়া যাবে বলে মনে হচ্ছে না।
উত্তর:
System.Reflection.Assembly.GetExecutingAssembly()
।Location
1
System.IO.Path.GetDirectoryName
আপনি যদি চান ডিরেক্টরি এটি একত্রিত ।
1 মিঃ মিনডোরের মতামত অনুসারে: কার্যনির্বাহী সমাবেশটি
System.Reflection.Assembly.GetExecutingAssembly().Location
যেখানে অবস্থিত সেখানে প্রত্যাবর্তন করে, যা কার্যকর না করার সময় অ্যাসেম্বলির অবস্থান যেখানে থাকতে পারে বা নাও হতে পারে। ছায়া অনুলিপি সমাবেশগুলির ক্ষেত্রে, আপনি একটি অস্থায়ী ডিরেক্টরিতে একটি পাথ পাবেন।System.Reflection.Assembly.GetExecutingAssembly().CodeBase
সমাবেশের 'স্থায়ী' পথ ফিরিয়ে দেবে।
GetExecutingAssembly
সমাবেশ কার্যকর করে যা বর্তমানে কার্যকর করা কোডটি ধারণ করে । এটি অগত্যা কনসোল .exe সমাবেশ হতে পারে না । এটি এমন কোনও সমাবেশ হতে পারে যা সম্পূর্ণ আলাদা অবস্থান থেকে লোড করা হয়েছে। আপনি ব্যবহার করতে হবে GetEntryAssembly
! এছাড়াও নোট করুন যে CodeBase
সমাবেশটি যখন জিএসি-তে থাকে তখন সেট করা নাও যেতে পারে। আরও ভাল বিকল্প AppDomain.CurrentDomain.BaseDirectory
।
আপনি বর্তমান অ্যাপ্লিকেশন ডিরেক্টরি পেতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।
AppDomain.CurrentDomain.BaseDirectory
BaseDirectory
রানটাইম এ সেট করা যেতে পারে? এটির জন্য কেবল একজন গেটর রয়েছে।
অ্যাপ্লিকেশনটির ডিরেক্টরি সন্ধানের জন্য আপনার কাছে দুটি বিকল্প রয়েছে, যা আপনি চয়ন করেছেন তা আপনার উদ্দেশ্য নির্ভর করবে।
// 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);
var localDirectory = new Uri(directory).LocalPath;
সম্ভবত কিছুটা দেরি হলেও এটি উল্লেখ করার মতো:
Environment.GetCommandLineArgs()[0];
বা আরও সঠিকভাবে কেবল ডিরেক্টরি পাথ পেতে:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
সম্পাদনা:
বেশ কিছু লোক উল্লেখ করেছে যে GetCommandLineArgs
প্রোগ্রামটির নাম ফেরত দেওয়ার গ্যারান্টিযুক্ত নয়। দেখুন কমান্ড লাইনের প্রথম শব্দটি কেবল কনভেনশন দ্বারা প্রোগ্রামের নাম । নিবন্ধটিতে উল্লেখ করা হয়েছে যে "যদিও খুব কম উইন্ডোজ প্রোগ্রাম এই কৌতুক ব্যবহার করে (আমি নিজের সম্পর্কে অবগত নই)"। সুতরাং 'স্পুফ' করা সম্ভব GetCommandLineArgs
, তবে আমরা একটি কনসোল অ্যাপ্লিকেশন সম্পর্কে কথা বলছি। কনসোল অ্যাপ্লিকেশনগুলি সাধারণত দ্রুত এবং নোংরা হয়। সুতরাং এটি আমার KISS দর্শনের সাথে খাপ খায়।
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 এসবিস্পোর্টাল_স্টেজিং" থেকে চলছে, সুতরাং প্রথম অ্যাপ্লিকেশনটি অবশ্যই ওয়েব অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত নয়।
উপরের উত্তরটি আমার প্রয়োজনের 90% ছিল, তবে আমার জন্য নিয়মিত পথের পরিবর্তে একটি উরি ফিরিয়েছিল।
এমএসডিএন ফোরাম পোস্টে যেমন ব্যাখ্যা করা হয়েছে, কীভাবে ইউআরআই পাথকে সাধারণ ফাইলপথে রূপান্তর করবেন? , আমি নিম্নলিখিত ব্যবহার:
// Get normal filepath of this assembly's permanent directory
var path = new Uri(
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
).LocalPath;
File.CreateDirectory(path)
এটি আপনাকে ব্যতিক্রম দেয় যে এটি ইউআরআই
#
চরিত্র) থাকে। সনাক্তকারী এবং এর অনুসরণকারী সমস্ত কিছুই ফলাফলের পথ থেকে কেটে ফেলা হয়েছে।
new Uri
এবং না System.IO.Path.GetDirectoryName
? এটি আপনাকে একটি এর পরিবর্তে একটি সাধারণ পাথ স্ট্রিং দেয় Uri
।
পরিবর্তে আপনি এটি ব্যবহার করতে পারেন।
System.Environment.CurrentDirectory
আপনি যদি একটি নেট কোর সামঞ্জস্যপূর্ণ উপায় খুঁজছেন, ব্যবহার করুন
System.AppContext.BaseDirectory
এটি নেট ফ্রেমওয়ার্ক 4.6 এবং। নেট কোর 1.0 (এবং। নেট স্ট্যান্ডার্ড 1.3) এ প্রবর্তিত হয়েছিল। দেখুন: AppContext.BaseD ডিরেক্টরী সম্পত্তি ।
এই পৃষ্ঠা অনুসারে ,
এটি নেট কোরে অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডাইরেক্টরির জন্য পছন্দসই প্রতিস্থাপন
Process.GetCurrentProcess().MainModule.FileName
কনসোল অ্যাপ্লিকেশনগুলির জন্য, আপনি এটি ব্যবহার করতে পারেন:
System.IO.Directory.GetCurrentDirectory();
আউটপুট (আমার স্থানীয় মেশিনে):
সি: \ ব্যবহারকারীগণ \ এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স \ ডকুমেন্টস \ ভিজ্যুয়াল স্টুডিও 2012 \ প্রকল্পগুলি \ ইমেজহ্যান্ডলার \ গেটডির \ বিন \ ডিবাগ
অথবা আপনি চেষ্টা করতে পারেন (শেষ পর্যন্ত একটি অতিরিক্ত ব্যাকস্ল্যাশ রয়েছে):
AppDomain.CurrentDomain.BaseDirectory
আউটপুট:
সি: \ ব্যবহারকারীগণ \ এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স \ ডকুমেন্টস \ ভিজ্যুয়াল স্টুডিও 2012 \ প্রকল্পগুলি \ ইমেজহ্যান্ডলার \ গেটডির \ বিন \ ডিবাগ \
BaseDirectory
রানটাইমে সেট করা যেতে পারে। এটি সঠিক হওয়ার গ্যারান্টিযুক্ত নয়"
আমি এই কোডটি ব্যবহার করে সমাধান পেয়েছি।
AppDomain.CurrentDomain.BaseDirectory
আপনি কেবল আপনার প্রকল্পের রেফারেন্সগুলিতে যুক্ত করতে System.Windows.Forms
পারেন এবং তারপরে System.Windows.Forms.Application.StartupPath
যথারীতি ব্যবহার করতে পারেন ।
সুতরাং, আরও জটিল পদ্ধতি বা প্রতিবিম্ব ব্যবহার করার প্রয়োজন নেই।
আমি এটি ব্যবহার করে যদি এক্সিকে ডাবল ক্লিক করে কল করার কথা বলা হয়
var thisPath = System.IO.Directory.GetCurrentDirectory();
আমি ব্যবহার করেছি
System.AppDomain.CurrentDomain.BaseDirectory
যখন আমি কোনও অ্যাপ্লিকেশন ফোল্ডারের সাথে সম্পর্কিত কোনও পাথ খুঁজতে চাই। এটি এএসপি. নেট এবং উইনফর্ম অ্যাপ্লিকেশন উভয়ের পক্ষে কাজ করে। এটির জন্য সিস্টেম.ওয়েব অ্যাসেম্বলিগুলির কোনও রেফারেন্সের প্রয়োজন হয় না।
নিম্নলিখিত লাইনটি আপনাকে একটি অ্যাপ্লিকেশন পাথ দেবে:
var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
উপরের সমাধানটি নিম্নলিখিত পরিস্থিতিতে সঠিকভাবে কাজ করছে:
mkbundle
বান্ডিল সহ (অন্য কোনও পদ্ধতি কাজ করে না)মানে, এপি / ইনোভের পদ্ধতিটি কেন নয়?
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");
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);
AppDomain.CurrentDomain.BaseDirectory
ইনস্টলেশন প্যাকেজ সহ তৃতীয় পক্ষের রেফারেন্স ফাইলগুলি উল্লেখ করার জন্য সমস্যাটি সমাধান করবে।
এগুলির কোনও পদ্ধতিই বিশেষ ক্ষেত্রে প্রতীকী লিঙ্কটি ব্যবহারের মতো বিশেষ ক্ষেত্রে কাজ করে না, তারা লিঙ্কটির অবস্থানটি আসল 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) + @"\";
}
}
এই সহজ কোডের লাইনটি ব্যবহার করে দেখুন:
string exePath = Path.GetDirectoryName( Application.ExecutablePath);
আর একটি সমাধান বর্তমান পাথের দিকে নির্দেশ করে আপেক্ষিক পথগুলি ব্যবহার করছে:
Path.GetFullPath(".")
। নেট কোর প্রতিবিম্বটি একটি ব্যবহারযোগ্য সিস্টেমে রূপান্তর করতে দেখলাম না I
public static string GetApplicationRoot()
{
var exePath = new Uri(System.Reflection.
Assembly.GetExecutingAssembly().CodeBase).LocalPath;
return new FileInfo(exePath).DirectoryName;
}
এটি আপনার কোডটি যেখানে রয়েছে সেখানে পূর্ণ "সি: \ xxx \ xxx" ফর্ম্যাট পথটি ফিরিয়ে দেবে।
এক্সিকিউটেবল পাথ পাওয়ার অনেকগুলি উপায় রয়েছে, যা আমাদের এটি ব্যবহার করা উচিত এটি আমাদের প্রয়োজনগুলির উপর নির্ভর করে একটি লিঙ্ক যা বিভিন্ন পদ্ধতি নিয়ে আলোচনা করে।
এখানে একটি নির্ভরযোগ্য সমাধান যা 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()
... তাদের তথ্য যেমন আইডি ইত্যাদি সহ আপনাকে বর্তমান প্রক্রিয়াটি দেবে এবং সীমিত নিয়ন্ত্রণ যেমন কিল ইত্যাদি *
সলিউশন এক্সপ্লোরার ব্যবহার করে আপনি প্রকল্পের মধ্যে সংস্থান হিসাবে একটি ফোল্ডার নাম তৈরি করতে পারেন, তবে আপনি সংস্থানগুলির মধ্যে একটি ফাইল পেস্ট করতে পারেন।
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);
}