কাস্টম এমএসবিল্ড টাস্ক তৈরি করার সময় আপনি সি # কোড থেকে বর্তমান প্রকল্প ডিরেক্টরিটি কীভাবে পাবেন?


133

বহিরাগত প্রোগ্রামটি হার্ডকডযুক্ত না করে চালানোর পরিবর্তে আমি বর্তমান প্রকল্প দির পেতে চাই। আমি কাস্টম টাস্কে একটি প্রক্রিয়া ব্যবহার করে একটি বাহ্যিক প্রোগ্রাম কল করছি।

আমি যে কিভাবে করতে হবে? অ্যাপডোমাইন.কন্টেনডোমাইন.বেস ডিরেক্টরী আমাকে কেবল ভিএস ২০০৮ এর অবস্থান দেয়।

উত্তর:


112

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

string startupPath = System.IO.Directory.GetCurrentDirectory();

string startupPath = Environment.CurrentDirectory;

আমাকে বলুন, কোনটি আপনাকে ভাল বলে মনে হচ্ছে


85
উপরের এই দুটিটি আপনাকে বিন ডিরেক্টরিতে নির্দেশ করে, সুতরাং আপনার সম্পূর্ণ সমাধানের জন্য উদাহরণস্বরূপ যদি একটি বিন ডিরেক্টরি থাকে তবে এটি আপনাকে সেখানে নির্দেশ করবে এবং আপনার প্রকল্প ডিরেক্টরিতে নয় (অথবা আপনার প্রকল্পের নীচে দুটি স্তর)
ম্যাচেক

16
উভয় সমাধান টেস্ট এক্সপ্লোরার ব্যবহার করার সময় প্রত্যাশার মতো কাজ করবে না।
Gucu112

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

25
ডিরেক্টরিটির জন্য +1.গেটপ্যারেন্ট () সুতরাং আমরা \ বিন \ ডিবাগ ডিরেক্টরিটি পাই না :)
ইস্টিন বাই

5
আমরা যদি কাস্টম টার্গেট সিপিইউ ব্যবহার করি? উদাহরণস্বরূপ, আমি যদি আমার বিল্ডটি x64 টার্গেট করতে সেট করি তবে এটি এর মধ্যে অন্য ফোল্ডার তৈরি করে।
সমীর আগুইয়ার

3
এটা সঠিক উত্তর. গৃহীত উত্তরটি বিন ডিরেক্টরিতে ফিরে আসে, যা প্রকল্প ডিরেক্টরি নয়।
পুকি

@ পুকির উত্তর আমার মামলার জন্য পুনরাবৃত্তভাবে ভুল। এটি আমাকে * / {প্রজেক্ট} / বিন ফোল্ডার দিচ্ছে, সুতরাং আমার একটি।
ক্যাপ্টেন প্রিনি

1
ভাল কাজ করা এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
অশোক কুমার গণেশান

42

যদি কোনও আইআইএস এক্সপ্রেসে কোনও প্রকল্প চলমান থাকে তবে Environment.CurrentDirectoryআইআইএস এক্সপ্রেসটি কোথায় অবস্থিত তা নির্দেশ করতে পারে (ডিফল্ট পাথ হবে সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ আইআইএস এক্সপ্রেস ), যেখানে আপনার প্রকল্পটি নেই to


এটি বিভিন্ন ধরণের প্রকল্পের জন্য সম্ভবত সবচেয়ে উপযুক্ত ডিরেক্টরি পথ।

AppDomain.CurrentDomain.BaseDirectory

এটি এমএসডিএন সংজ্ঞা।

অ্যাসেম্বলি রিসলভার অ্যাসেম্বলির অনুসন্ধানের জন্য যে বেস ডিরেক্টরিটি ব্যবহার করে তা পায়।


21
9 বছর পরে এবং কারও কাছে আসল উত্তর রয়েছে।
জেফ ডেভিস

নেট কোরটিতে কোনও অ্যাপডোমেন নেই is আপনাকে এই জাতীয় কিছু করতে হবে। সিস্টেম.আরুনটাইম.লাডার.অ্যাস্পশনলুডকন্টেক্সট.ডেফল্ট.অনলোড হচ্ছে + = প্রসঙ্গ => ইনভোকব্যাচপ্রসেসরগুলি ();
লেটেন্সি

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

2
@ লেটেন্সি একটি নেট নেট 3 ডাব্লুপিএফ প্রকল্পে আছে
আলেকজান্ডার

হ্যাঁ, আমি চশমা পড়ি। এটি অবশ্যই 3,0 এর মতো কিছু নয়। আমি তখন থেকে এটি ব্যবহার করে আসছি। খুব সন্তুষ্ট. আমি মনে করি যে আমি এই প্রাক 3.0 পোস্ট করেছি তাই স্পষ্টতার জন্য ধন্যবাদ।
অদৃশ্যতা

18

এটি বর্তমান নির্বাহী ডিরেক্টরি থেকে দুটি স্তর উপরে নেভিগেট করে আপনাকে প্রকল্প ডিরেক্টরিটিও দেবে (এটি প্রতিটি বিল্ডের জন্য প্রকল্প ডিরেক্টরিটি ফিরিয়ে দেবে না, তবে এটি সবচেয়ে সাধারণ)।

System.IO.Path.GetFullPath(@"..\..\")

অবশ্যই আপনি এটি কোনও প্রকারের বৈধতা / ত্রুটি পরিচালনার লজিকের ভিতরে রাখতে চান।


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

এটি কোনও কারণে আমাকে রুট ড্রাইভ দিচ্ছে।
ক্যাপ্টেন প্রিনি

10

আপনি যদি ওটি জানতে চান যে যেখানে আপনার সমাধানটি রয়েছে সেই ডিরেক্টরিটি কী, আপনার এটি করা দরকার:

 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;

5

আমি এটিও খুঁজছিলাম আমি এমন একটি প্রকল্প পেয়েছি যা এইচডব্লিউসি চালায় এবং আমি ওয়েব সাইটটিকে অ্যাপ গাছের বাইরে রাখতে চাই, তবে আমি এটি ডিবাগ (বা প্রকাশ) ডিরেক্টরিতে রাখতে চাই না। FWIW, গৃহীত সমাধান (এবং এটির পাশাপাশি একটি) এক্সিকিউটেবল যে ডিরেক্টরিটি চালাচ্ছে তা কেবল চিহ্নিত করে।

এই ডিরেক্টরিটি খুঁজতে, আমি ব্যবহার করছি

string startupPath = System.IO.Path.GetFullPath(".\\").

5

Gucu112 এর উত্তরের ভিত্তিতে , তবে .NET কোর কনসোল / উইন্ডো অ্যাপ্লিকেশনটির জন্য এটি হওয়া উচিত:

string projectDir = 
    Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\.."));

আমি এটি .NET কোর উইন্ডো অ্যাপ্লিকেশনটির জন্য একটি xUnit প্রকল্পে ব্যবহার করছি।


4

এটি করার আরেকটি উপায়

string startupPath = System.IO.Directory.GetParent(@"./").FullName;

আপনি যদি বিন ফোল্ডারে পাথ পেতে চান

string startupPath = System.IO.Directory.GetParent(@"../").FullName;

সম্ভবত আরও ভাল উপায় আছে =)


4

তবুও আরেকটি অসম্পূর্ণ সমাধান (তবে অন্যদের তুলনায় সম্ভবত নিখুঁতভাবে কিছুটা কাছাকাছি):

    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বিকল্পগুলির জন্য ডিফল্ট মান পরিবর্তন করতে হবে না ।



4

এই সমাধানটি সি # এর মাধ্যমে ASP.NET MVC5 এর সাথে TEST এবং PRD সার্ভারগুলিতে বিকাশে এবং টেস্ট এবং প্রড সার্ভারেও আমার পক্ষে ভাল কাজ করে :

var projectDir = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);

যদি আপনার প্রকল্পের কনফিগারেশন ফাইলের প্রকল্প ডিরেক্টরি প্রয়োজন হয় :

$(ProjectDir)

3

শেষ পর্যন্ত কোনও উত্তর পেতে জনসাধারণের স্ট্রিংয়ের বিষয়ে আমার প্রথম উত্তরটি পোলিশ করা শেষ করার পরে, এটি আমার উপর ছড়িয়ে পড়ে যে আপনি সম্ভবত আপনার কাঙ্ক্ষিত ফলাফল পেতে রেজিস্ট্রি থেকে কোনও মান পড়তে পারেন। দেখা যাচ্ছে যে, সেই রুটটি আরও ছোট ছিল:

প্রথমত, আপনাকে অবশ্যই মাইক্রোসফ্ট অন্তর্ভুক্ত করতে হবে 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; ইত্যাদি) সংস্করণ অংশটি পরিবর্তন করতে হবে।

আপনি যদি আমার কোনও উত্তর ব্যবহার করেন, এবং যদি এটি জিজ্ঞাসা করা খুব বেশি না হয় তবে আমি জানতে চাই আপনি আমার কোন পদ্ধতি ব্যবহার করেছেন এবং কেন। শুভকামনা।

  • জন্য dm

3

আমার একই অবস্থা ছিল এবং ফলহীন গুগলসের পরে আমি একটি সর্বজনীন স্ট্রিং ঘোষণা করে যা প্রকল্পের পাথ পেতে ডিবাগ / রিলিজ পাথের একটি স্ট্রিং মানকে মোড করে। এই পদ্ধতিটি ব্যবহার করার একটি সুবিধা হ'ল এটি যেহেতু কারেন্ট প্রকল্পের ডিরেক্টরিটি ব্যবহার করে, তাই আপনি কোনও ডিবাগ ডিরেক্টরি বা রিলিজ ডিরেক্টরি থেকে কাজ করছেন কিনা তা বিবেচ্য নয়:

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

এটি বেশিরভাগ ক্ষেত্রেই কাজ করা উচিত ।


3

প্রকল্প ডিরেক্টরি (এটি আমার জন্য কাজ করা) পেতে এটি ব্যবহার করুন:

string projectPath = 
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

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

2

কাজটি শেষ করার জন্য আমি নিম্নলিখিত সমাধানগুলি ব্যবহার করেছি:

string projectDir =
    Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));

2

চেষ্টা করুন:

var pathRegex = new Regex(@"\\bin(\\x86|\\x64)?\\(Debug|Release)$", RegexOptions.Compiled);
var directory = pathRegex.Replace(Directory.GetCurrentDirectory(), String.Empty);

এটি অন্যদের থেকে পৃথক সমাধানটি সম্ভাব্য x86 বা x64 বিল্ডকেও বিবেচনা করে না।


টার্গেটফ্রেমওয়ার্কটি যেখানে পাথের মধ্যে অন্তর্ভুক্ত করা হয়েছে সেখানে নতুন সিএসপোজ ফাইলগুলির জন্য এই সমাধানটি প্রায় রয়েছে।
গ্লেন ওয়াটসন

1
নতুন। নেটস্কোর স্টাইলের ফর্ম্যাটের জন্য আমার কাছে নতুন রেইজেক্স ছিল (@ "\\ বিন (\\ x86 | \\ x64)? \ (ডিবাগ | রিলিজ) (\ [a-zA-Z0-9।] *)? $" , রেজেক্সঅপশনস.কম্পাইলড)
গ্লেন ওয়াটসন

1

সবচেয়ে ভালো সমাধান

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

0

আপনি যদি সত্যই উত্স প্রকল্প ডিরেক্টরিটি নিশ্চিত করতে চান তবে বিন আউটপুট পাথ কী সেট করা হয়েছে তা বিবেচনা করেই:

  1. একটি প্রাক-বিল্ড ইভেন্ট কমান্ড লাইন যুক্ত করুন (ভিজ্যুয়াল স্টুডিও: প্রকল্পের বৈশিষ্ট্য -> ইভেন্টগুলি তৈরি করুন):

    echo $(MSBuildProjectDirectory) > $(MSBuildProjectDirectory)\Resources\ProjectDirectory.txt

  2. ProjectDirectory.txtপ্রকল্পটির রিসোর্স.আরেক্সে ফাইল যুক্ত করুন (এটি এখনও উপস্থিত না থাকলে, প্রকল্পটি ডান ক্লিক করুন -> নতুন আইটেম যুক্ত করুন -> সংস্থান ফাইল)

  3. সহ কোড থেকে অ্যাক্সেস করুন Resources.ProjectDirectory

-1

এটি ভিএস ২০১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);
    }
  }

-6

Directory.GetParent (Directory.GetCurrentDirectory ())। Parent.Parent.Parent.Parent.FullName

আপনাকে প্রকল্প ডিরেক্টরি দেবে।


77
সত্যি? আমি মনে করি আপনি একজন অভিভাবক দিতে ভুলে গেছেন
শন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.