এএসপি.নেট এমভিসি - কন্ট্রোলার থেকে অ্যাপ_ডাটা ফোল্ডারের নিখুঁত পথ সন্ধান করুন


282

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

এটা কাজ করে না:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");

        //.... do whatever 

        return View();
    }

}

আমি মনে করি ওয়েব প্রসঙ্গে ভার্চুয়ালপ্যাথ ইউটিলিটির বাইরে। স্ট্রিং পাথটি "C: \ App_Data \ somedata.xML" হিসাবে ফিরে আসে

এমভিসি অ্যাপে .xML ফাইলের পথটি কোথায় নির্ধারণ করব? গ্লোবাল.অ্যাসাক্স এবং এটি একটি অ্যাপ্লিকেশন-স্তরের ভেরিয়েবল স্টিক করুন?


আমি অনুমান করি উদ্বেগ এবং টেস্টিবিলিটি অর্থে পৃথকীকরণ - ভার্চুয়ালপ্যাথ ইউটিলিটি.টিও অবিসুলিউট () কাজ করা উচিত নয়। তবে তাহলে এটি করার সঠিক উপায় কী?
বাডিজে

উত্তর:


398

এএসপি.নেট এমভিসি 1 -> এমভিসি 3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");

এএসপি.নেট এমভিসি 4

string path = Server.MapPath("~/App_Data/somedata.xml");


এমএসডিএন রেফারেন্স:

এইচটিপিএস সার্ভার ইউটিলিটি.ম্যাপপথ পদ্ধতি


6
@ ক্লিটন ব্যতীত উরল.সন্টেন্ট একটি ইউআরএল দেয়, সার্ভারের পথ নয়।
অ্যান্ড্রু ডানকম্যান

8
mvc4 জন্য এটি শুধুমাত্র Server.MapPath ()
SeriousM

6
এমভিসি 4 উপায় কাজ করে না, আমাকে হয় ব্যবহার করতে হবে Currentবা Server.MapPath(...)সিরিয়াসএম উল্লিখিত হিসাবে।
গিগিগোরান

26
ব্যবহার করুনSystem.Web.Hosting.HostingEnvironment.MapPath()
ভিন্স পানুসিওও

1
এইচটিটিপি কনটেক্সট-এ কল করুন urrent বর্তমানের এমন কিছু পরিস্থিতিতে কাজ করবেন না যেখানে এইচটিটিপি কনটেক্সট (অ্যাপ্লিকেশন_স্টার্ট ইত্যাদি) নেই
mcintyre321

274
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

এটি সম্ভবত এটি পাওয়ার আরও একটি "সঠিক" উপায়।


25
কারণ এটি "অ্যাপ_ডাটা" স্ট্রিংটিকে হার্ডকডিং করছে না। যে ভবিষ্যতের সংস্করণে পরিবর্তন করতে পারেন অথবা মনো ইত্যাদি ইত্যাদি আলাদা হতে
অ্যালেক্স

19
এই উত্তরের সুন্দর জিনিসটি হ'ল আমি এটিকে আমার মডেল প্রজেক্টে রেফারেন্স সিস্টেম ছাড়াই ব্যবহার করতে পারি b ওয়েব, এভাবে একটি পরিষ্কার বিচ্ছিন্নতা রাখতে সহায়তা করে। সুন্দর!
ফ্রান্স

10
ব্লগ পোস্ট পিট এটিকে কেন ব্যবহার করা দুর্দান্ত ধারণা হতে পারে না সে সম্পর্কেও আলোচনা করে।
অ্যান্ডি

13
এমএসডিএন-তে নথিভুক্ত নয় , সুতরাং ব্যবহার করা উচিত নয়।
আলেকজান্ডার আব্রামভ

10
"অ্যাপ_ডাটা" এর পরিবর্তে অন্য স্ট্রিংকে হার্ড-কোডিং কোনও "সঠিক" উপায় নয়। এছাড়াও .NET কোর এ আর কোনও অ্যাপ ডোমেন নেই।
ইউজারকন্ট্রোল

139

আমি ডাব্লুএফএফ পরিষেবাদির পরিপ্রেক্ষিতে এটি কাজ করার HostingEnvironmentপরিবর্তে ব্যবহার করার অভ্যাসে থাকার চেষ্টা Serverকরি।

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");

6
Server.MapPath () পরিণামে HostingEnvironment.MapPath () কল দেখতে stackoverflow.com/questions/944219/...
টড

3
এটি আমার প্রিয় কারণ যেহেতু আমি এটিকে আমার নিয়ামকদের বাইরে ব্যবহার করতে পারি। System.Web.Hostingপ্রাসঙ্গিক কারও জানা প্রয়োজনের ক্ষেত্রে এটি নামস্থানটিতে using। রেফ: ডকস.মাইক্রোসফট.ইন- ইউএস
ডটনেট

7

সবচেয়ে সঠিক উপায় ব্যবহার করা হয় HttpContext.Current.Server.MapPath("~/App_Data");। এর অর্থ আপনি কেবল এমন কোনও পদ্ধতি থেকে পথটি পুনরুদ্ধার করতে পারেন যেখানে HttpContextউপলব্ধ। এটি উপলব্ধি করে: অ্যাপ_ডাটা ডিরেক্টরিটি একটি ওয়েব প্রকল্প ফোল্ডার কাঠামো [1]।

আপনার যদি এমন ক্লাস থেকে App / App_Data যাওয়ার পথের প্রয়োজন হয় যেখানে আপনার অ্যাক্সেস নেই তবে HttpContextআপনি সর্বদা আপনার IoC ধারকটি সরবরাহকারী ইন্টারফেসটি ইনজেক্ট করতে পারেন:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

এটি ব্যবহার করে এটি প্রয়োগ করুন HttpApplication:

public class AppDataPathProvider : IAppDataPathProvider
{
    public string GetAppDataPath()
    {
        return MyHttpApplication.GetAppDataPath();
    }
}

যেখানে MyHttpApplication.GetAppDataPathদেখতে দেখতে:

public class MyHttpApplication : HttpApplication
{
    // of course you can fetch&store the value at Application_Start
    public static string GetAppDataPath()
    {
        return HttpContext.Current.Server.MapPath("~/App_Data");
    }
}

[1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx


কিভাবে স্ট্যাটিক পারে HttpContext.Currentকি কখনো না যদি আপনি এটি ব্যবহার করছেন এক জায়গায় পাওয়া যাবে - একটি আইওসি ধারক মাধ্যমে - অন্য জায়গায়? স্থির সম্পত্তি কোথায় পাওয়া যাবে না?
এম মিম্পেন

এটি কেবল ওয়েব প্রকল্পে উপলব্ধ। এটা কি তোমার প্রশ্নের উত্তর? আমি নিশ্চিত যে আমি পুরোপুরি বুঝতে পেরেছি না। আজ আমি মনে করি আমি এই (স্বীকারোক্তিকরূপে সহজ) সমস্যাটি কিছুটা আলাদা সমাধান করতে পারি। আমি সম্ভবত একই সরবরাহকারী ইন্টারফেসটি ব্যবহার করতে পারতাম তবে অ্যাপ্লিকেশন রুটে পাথ দিয়ে এটি অ্যাপ্লিকেশন_স্টার্টে সেট আপ করতাম।
ড্যানিয়েল লিডস্ট্রোম

না, এইচটিটিপি কনটেক্সট.কেন্দ্র কেবল ওয়েব প্রকল্পে উপলভ্য নয় ... আপনি যদি এমন কোনও প্রকল্পের উল্লেখ করেন যা গেটঅ্যাপডাটাপথ () রয়েছে তবে এটি সর্বদা এইচটিটিপি কনটেক্সট.ও বর্তমান হিসাবে উল্লেখ করতে হবে। উদাহরণস্বরূপ, আপনি যদি গ্রন্থাগার A ব্যবহার করেন যা গ্রন্থাগার বি ব্যবহার করে, আপনার অ্যাপ্লিকেশনটির জন্য A এবং B গ্রন্থাগারের উল্লেখ থাকতে হবে
এম মিম্পেন

মাঝে মাঝে ইন্ডিয়ারেশনের স্তরের মধ্য দিয়ে সরাসরি HTTPContext অ্যাক্সেস না করা সুবিধাজনক। উদাহরণস্বরূপ ইউনিট পরীক্ষা চিন্তা করুন। টেস্টিবিলিটি হ'ল আমি কেন এইভাবে জিনিস করি। তবে আমি মনে করি আপনি আপনার বক্তব্যটি সম্পর্কে ভুল। সমাবেশগুলির মধ্যে কেবল ইন্টারফেসটি ভাগ করা দরকার। এই কারণেই আপনি পরীক্ষাগুলির জন্য এটি উপহাস করতে পারেন, অর্থাত পরীক্ষার জন্য আপনার এইচটিটিপি কনটেক্সট দরকার নেই need বর্তমানের জন্য urrent দুঃখিত যদি আমি আপনার জন্য জিনিস
গুলিয়ে

6

ফিল হকের একটি উদাহরণ রয়েছে যা আমি মনে করি পাগল "\" স্টাইল ডিরেক্টরি বিভাজকগুলির সাথে পাথগুলি পরিচালনা করার সময় কিছুটা স্থিতিশীল। এটি নিরাপদে পথের সংমিশ্রণ পরিচালনা করে। এটি System.IO এ বিনামূল্যে আসে

var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);

তবে, আপনি "সার্ভার.ম্যাপপথ" এর পরিবর্তে "অ্যাপডোমাইন.কন্টেনডোমাইন.বেসডাইরেক্টর" চেষ্টা করে দেখতে পারেন।


4
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");

অথবা

string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");

1
যদিও এই কোডটি সমস্যা সমাধানে সহায়তা করতে পারে, কেন এবং / অথবা এটি কীভাবে প্রশ্নের উত্তর দেয় সে সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে এর দীর্ঘমেয়াদী মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
oɔɯǝɹ

1
string Index = i;
            string FileName = "Mutton" + Index + ".xml";
            XmlDocument xmlDoc = new XmlDocument();

            var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName);
            xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString);

এই মুহুর্তে ঠিক কী প্রয়োজন সেই পথটি পেতে এটিই সেরা সমাধান

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