উত্তর:
আপনি এই দুটি পদ্ধতির একটি ব্যবহার করতে পারেন।
string startupPath = System.IO.Directory.GetCurrentDirectory();
string startupPath = Environment.CurrentDirectory;
আমাকে বলুন, কোনটি আপনাকে ভাল বলে মনে হচ্ছে
using System;
using System.IO;
// This will get the current WORKING directory (i.e. \bin\Debug)
string workingDirectory = Environment.CurrentDirectory;
// or: Directory.GetCurrentDirectory() gives the same result
// This will get the current PROJECT directory
string projectDirectory = Directory.GetParent(workingDirectory).Parent.FullName;
যদি কোনও আইআইএস এক্সপ্রেসে কোনও প্রকল্প চলমান থাকে তবে Environment.CurrentDirectory
আইআইএস এক্সপ্রেসটি কোথায় অবস্থিত তা নির্দেশ করতে পারে (ডিফল্ট পাথ হবে সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ আইআইএস এক্সপ্রেস ), যেখানে আপনার প্রকল্পটি নেই to
এটি বিভিন্ন ধরণের প্রকল্পের জন্য সম্ভবত সবচেয়ে উপযুক্ত ডিরেক্টরি পথ।
AppDomain.CurrentDomain.BaseDirectory
এটি এমএসডিএন সংজ্ঞা।
অ্যাসেম্বলি রিসলভার অ্যাসেম্বলির অনুসন্ধানের জন্য যে বেস ডিরেক্টরিটি ব্যবহার করে তা পায়।
এটি বর্তমান নির্বাহী ডিরেক্টরি থেকে দুটি স্তর উপরে নেভিগেট করে আপনাকে প্রকল্প ডিরেক্টরিটিও দেবে (এটি প্রতিটি বিল্ডের জন্য প্রকল্প ডিরেক্টরিটি ফিরিয়ে দেবে না, তবে এটি সবচেয়ে সাধারণ)।
System.IO.Path.GetFullPath(@"..\..\")
অবশ্যই আপনি এটি কোনও প্রকারের বৈধতা / ত্রুটি পরিচালনার লজিকের ভিতরে রাখতে চান।
আপনি যদি ওটি জানতে চান যে যেখানে আপনার সমাধানটি রয়েছে সেই ডিরেক্টরিটি কী, আপনার এটি করা দরকার:
var parent = Directory.GetParent(Directory.GetCurrentDirectory()).Parent;
if (parent != null)
{
var directoryInfo = parent.Parent;
string startDirectory = null;
if (directoryInfo != null)
{
startDirectory = directoryInfo.FullName;
}
if (startDirectory != null)
{ /*Do whatever you want "startDirectory" variable*/}
}
আপনি যদি কেবল GetCurrrentDirectory()
পদ্ধতি দিয়ে থাকেন তবে আপনি বিল্ড ফোল্ডারটি পাবেন যদি আপনি ডিবাগ করছেন বা ছেড়ে দিচ্ছেন তা নির্বিশেষে। আমি এই সাহায্য আশা করি! আপনি যদি বৈধতাগুলি ভুলে যান তবে এটি এমন হবে:
var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
আমি এটিও খুঁজছিলাম আমি এমন একটি প্রকল্প পেয়েছি যা এইচডব্লিউসি চালায় এবং আমি ওয়েব সাইটটিকে অ্যাপ গাছের বাইরে রাখতে চাই, তবে আমি এটি ডিবাগ (বা প্রকাশ) ডিরেক্টরিতে রাখতে চাই না। FWIW, গৃহীত সমাধান (এবং এটির পাশাপাশি একটি) এক্সিকিউটেবল যে ডিরেক্টরিটি চালাচ্ছে তা কেবল চিহ্নিত করে।
এই ডিরেক্টরিটি খুঁজতে, আমি ব্যবহার করছি
string startupPath = System.IO.Path.GetFullPath(".\\").
Gucu112 এর উত্তরের ভিত্তিতে , তবে .NET কোর কনসোল / উইন্ডো অ্যাপ্লিকেশনটির জন্য এটি হওয়া উচিত:
string projectDir =
Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\.."));
আমি এটি .NET কোর উইন্ডো অ্যাপ্লিকেশনটির জন্য একটি xUnit প্রকল্পে ব্যবহার করছি।
এটি করার আরেকটি উপায়
string startupPath = System.IO.Directory.GetParent(@"./").FullName;
আপনি যদি বিন ফোল্ডারে পাথ পেতে চান
string startupPath = System.IO.Directory.GetParent(@"../").FullName;
সম্ভবত আরও ভাল উপায় আছে =)
তবুও আরেকটি অসম্পূর্ণ সমাধান (তবে অন্যদের তুলনায় সম্ভবত নিখুঁতভাবে কিছুটা কাছাকাছি):
protected static string GetSolutionFSPath() {
return System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.FullName;
}
protected static string GetProjectFSPath() {
return String.Format("{0}\\{1}", GetSolutionFSPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
}
বর্তমান সংস্করণটি না হলেও এই সংস্করণটি বর্তমান প্রকল্পগুলির ফোল্ডারটি ফিরিয়ে দেবেStartup Project
সমাধানের জন্য ।
এর সাথে প্রথম ত্রুটিটি হ'ল আমি সমস্ত ত্রুটি পরীক্ষা করা বাদ দিয়েছি। এটি যথেষ্ট সহজভাবে সংশোধন করা যেতে পারে তবে কেবলমাত্র যদি আপনার প্রকল্পটি ড্রাইভের জন্য মূল ডিরেক্টরিতে আপনার প্রকল্পটি সংরক্ষণ করা হয় বা আপনার পথে একটি জংশন ব্যবহার করা হয় তবেই সমস্যা হওয়া উচিত (এবং সেই জংশনটি সমাধান ফোল্ডারের বংশধর) তাই এই দৃশ্যটি অসম্ভব is । আমি পুরোপুরি নিশ্চিত নই যে ভিজ্যুয়াল স্টুডিও যে কোনওভাবে এই সেটআপগুলির কোনওটিকে পরিচালনা করতে পারে।
আর একটি (সম্ভবত সম্ভাব্য) সমস্যা যা আপনি চালাতে পারেন তা হ'ল প্রকল্পের নাম অবশ্যই এটির জন্য প্রকল্পের ফোল্ডারের নামের সাথে মেলে।
আপনার আর একটি সমস্যা হতে পারে যে প্রকল্পটি অবশ্যই সমাধানের ফোল্ডারের ভিতরে থাকতে পারে। এটি সাধারণত কোনও সমস্যা নয় তবে আপনি যদি Add Existing Project to Solution
প্রকল্পটি সমাধানে যোগ করার বিকল্পটি ব্যবহার করেন তবে আপনার সমাধানটি সাজানোর পদ্ধতি এটি নাও হতে পারে।
সবশেষে, আপনি যদি অ্যাপ্লিকেশনটি ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করে চলেছেন তবে এটি করার আগে আপনার এই মানটি সংরক্ষণ করা উচিত কারণ এই মানটি বর্তমান কার্যনির্বাহী ডিরেক্টরিটির সাথে সম্পর্কিত determined
অবশ্যই, এর অর্থ এইও হ'ল আপনাকে অবশ্যই প্রকল্পের বৈশিষ্ট্য সংলাপের প্রকল্পগুলির ' Build
-> Output path
বা Debug
-> Working directory
বিকল্পগুলির জন্য ডিফল্ট মান পরিবর্তন করতে হবে না ।
এই সমাধানটি সি # এর মাধ্যমে ASP.NET MVC5 এর সাথে TEST এবং PRD সার্ভারগুলিতে বিকাশে এবং টেস্ট এবং প্রড সার্ভারেও আমার পক্ষে ভাল কাজ করে :
var projectDir = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
যদি আপনার প্রকল্পের কনফিগারেশন ফাইলের প্রকল্প ডিরেক্টরি প্রয়োজন হয় :
$(ProjectDir)
শেষ পর্যন্ত কোনও উত্তর পেতে জনসাধারণের স্ট্রিংয়ের বিষয়ে আমার প্রথম উত্তরটি পোলিশ করা শেষ করার পরে, এটি আমার উপর ছড়িয়ে পড়ে যে আপনি সম্ভবত আপনার কাঙ্ক্ষিত ফলাফল পেতে রেজিস্ট্রি থেকে কোনও মান পড়তে পারেন। দেখা যাচ্ছে যে, সেই রুটটি আরও ছোট ছিল:
প্রথমত, আপনাকে অবশ্যই মাইক্রোসফ্ট অন্তর্ভুক্ত করতে হবে W উইন 32 নেমস্পেস যাতে আপনি রেজিস্ট্রি নিয়ে কাজ করতে পারেন:
using Microsoft.Win32; // required for reading and / or writing the registry
এখানে মূল কোড:
RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\9.0", false);
string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation");
এই উত্তরের একটি নোট:
আমি ভিজ্যুয়াল স্টুডিও 2008 পেশাদার সংস্করণ ব্যবহার করছি। আপনি যদি অন্য সংস্করণ ব্যবহার করেন (যেমন 2003, 2005, 2010; ইত্যাদি), তবে আপনাকে সাবকি স্ট্রিংয়ের (সংস্করণ 8.0, 7.0; ইত্যাদি) সংস্করণ অংশটি পরিবর্তন করতে হবে।
আপনি যদি আমার কোনও উত্তর ব্যবহার করেন, এবং যদি এটি জিজ্ঞাসা করা খুব বেশি না হয় তবে আমি জানতে চাই আপনি আমার কোন পদ্ধতি ব্যবহার করেছেন এবং কেন। শুভকামনা।
আমার একই অবস্থা ছিল এবং ফলহীন গুগলসের পরে আমি একটি সর্বজনীন স্ট্রিং ঘোষণা করে যা প্রকল্পের পাথ পেতে ডিবাগ / রিলিজ পাথের একটি স্ট্রিং মানকে মোড করে। এই পদ্ধতিটি ব্যবহার করার একটি সুবিধা হ'ল এটি যেহেতু কারেন্ট প্রকল্পের ডিরেক্টরিটি ব্যবহার করে, তাই আপনি কোনও ডিবাগ ডিরেক্টরি বা রিলিজ ডিরেক্টরি থেকে কাজ করছেন কিনা তা বিবেচ্য নয়:
public string DirProject()
{
string DirDebug = System.IO.Directory.GetCurrentDirectory();
string DirProject = DirDebug;
for (int counter_slash = 0; counter_slash < 4; counter_slash++)
{
DirProject = DirProject.Substring(0, DirProject.LastIndexOf(@"\"));
}
return DirProject;
}
তারপরে আপনি কেবলমাত্র একটি লাইন ব্যবহার করে এটি কল করতে সক্ষম হবেন:
string MyProjectDir = DirProject();
এটি বেশিরভাগ ক্ষেত্রেই কাজ করা উচিত ।
প্রকল্প ডিরেক্টরি (এটি আমার জন্য কাজ করা) পেতে এটি ব্যবহার করুন:
string projectPath =
Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
using System;
using System.IO;
// Get the current directory and make it a DirectoryInfo object.
// Do not use Environment.CurrentDirectory, vistual studio
// and visual studio code will return different result:
// Visual studio will return @"projectDir\bin\Release\netcoreapp2.0\", yet
// vs code will return @"projectDir\"
var currentDirectory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
// On windows, the current directory is the compiled binary sits,
// so string like @"bin\Release\netcoreapp2.0\" will follow the project directory.
// Hense, the project directory is the great grand-father of the current directory.
string projectDirectory = currentDirectory.Parent.Parent.Parent.FullName;
চেষ্টা করুন:
var pathRegex = new Regex(@"\\bin(\\x86|\\x64)?\\(Debug|Release)$", RegexOptions.Compiled);
var directory = pathRegex.Replace(Directory.GetCurrentDirectory(), String.Empty);
এটি অন্যদের থেকে পৃথক সমাধানটি সম্ভাব্য x86 বা x64 বিল্ডকেও বিবেচনা করে না।
সবচেয়ে ভালো সমাধান
string PjFolder1 =
Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).
Parent.Parent.FullName;
অন্যান্য সমাধান
string pjFolder2 = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)));
এটি পরীক্ষা করুন, অ্যাপডোমাইন.কন্টেনডোমাইন.বেস ডিরেক্টরীটি আমার জন্য অতীতে প্রজেক্টে কাজ করেছে, এখন আমি ডিবাগ ফোল্ডারটি পেয়েছি .... নির্বাচিত উত্তম উত্তরটি ঠিক কাজ করে না !.
//Project DEBUG folder, but STILL PROJECT FOLDER
string pjDebugFolder = AppDomain.CurrentDomain.BaseDirectory;
//Visual studio folder, NOT PROJECT FOLDER
//This solutions just not work
string vsFolder = Directory.GetCurrentDirectory();
string vsFolder2 = Environment.CurrentDirectory;
string vsFolder3 = Path.GetFullPath(".\\");
//Current PROJECT FOLDER
string ProjectFolder =
//Get Debug Folder object from BaseDirectory ( the same with end slash)
Directory.GetParent(pjDebugFolder).
Parent.//Bin Folder object
Parent. //Project Folder object
FullName;//Project Folder complete path
আপনি যদি সত্যই উত্স প্রকল্প ডিরেক্টরিটি নিশ্চিত করতে চান তবে বিন আউটপুট পাথ কী সেট করা হয়েছে তা বিবেচনা করেই:
একটি প্রাক-বিল্ড ইভেন্ট কমান্ড লাইন যুক্ত করুন (ভিজ্যুয়াল স্টুডিও: প্রকল্পের বৈশিষ্ট্য -> ইভেন্টগুলি তৈরি করুন):
echo $(MSBuildProjectDirectory) > $(MSBuildProjectDirectory)\Resources\ProjectDirectory.txt
ProjectDirectory.txt
প্রকল্পটির রিসোর্স.আরেক্সে ফাইল যুক্ত করুন (এটি এখনও উপস্থিত না থাকলে, প্রকল্পটি ডান ক্লিক করুন -> নতুন আইটেম যুক্ত করুন -> সংস্থান ফাইল)
Resources.ProjectDirectory
।এটি ভিএস ২০১7 w ডাব্লু / এসডিকে কোর এমএস বিল্ড কনফিগারেশনে কাজ করে।
আপনার এনভিডিটিই / এনভডিটিই 80 প্যাকেজগুলিতে নুগেট দরকার।
সিওএম বা ইন্টারপ ব্যবহার করবেন না। কিছু .... আবর্জনা !!
internal class Program {
private static readonly DTE2 _dte2;
// Static Constructor
static Program() {
_dte2 = (DTE2)Marshal.GetActiveObject("VisualStudio.DTE.15.0");
}
private static void FindProjectsIn(ProjectItem item, List<Project> results) {
if (item.Object is Project) {
var proj = (Project) item.Object;
if (new Guid(proj.Kind) != new Guid(Constants.vsProjectItemKindPhysicalFolder))
results.Add((Project) item.Object);
else
foreach (ProjectItem innerItem in proj.ProjectItems)
FindProjectsIn(innerItem, results);
}
if (item.ProjectItems != null)
foreach (ProjectItem innerItem in item.ProjectItems)
FindProjectsIn(innerItem, results);
}
private static void FindProjectsIn(UIHierarchyItem item, List<Project> results) {
if (item.Object is Project) {
var proj = (Project) item.Object;
if (new Guid(proj.Kind) != new Guid(Constants.vsProjectItemKindPhysicalFolder))
results.Add((Project) item.Object);
else
foreach (ProjectItem innerItem in proj.ProjectItems)
FindProjectsIn(innerItem, results);
}
foreach (UIHierarchyItem innerItem in item.UIHierarchyItems)
FindProjectsIn(innerItem, results);
}
private static IEnumerable<Project> GetEnvDTEProjectsInSolution() {
var ret = new List<Project>();
var hierarchy = _dte2.ToolWindows.SolutionExplorer;
foreach (UIHierarchyItem innerItem in hierarchy.UIHierarchyItems)
FindProjectsIn(innerItem, ret);
return ret;
}
private static void Main() {
var projects = GetEnvDTEProjectsInSolution();
var solutiondir = Path.GetDirectoryName(_dte2.Solution.FullName);
// TODO
...
var project = projects.FirstOrDefault(p => p.Name == <current project>);
Console.WriteLine(project.FullName);
}
}
Directory.GetParent (Directory.GetCurrentDirectory ())। Parent.Parent.Parent.Parent.FullName
আপনাকে প্রকল্প ডিরেক্টরি দেবে।