সি #% অ্যাপডেটা% এর পথ পাচ্ছে


387

সি # 2008 এসপি 1

আমি নীচের কোডটি ব্যবহার করছি:

dt.ReadXml("%AppData%\\DateLinks.xml");

যাইহোক, আমি একটি ব্যতিক্রম পাচ্ছি যা আমার অ্যাপ্লিকেশনটি যেখান থেকে চলছে তার দিকে নির্দেশ করে:

'ডি: jects প্রকল্পগুলি \ সাবভারসিওনপ্রজেক্টস \ ক্যাটডায়লার \ বিন \ ডিবাগ \% অ্যাপডেটা% \ ডেটলিংকস.এমএমএল' পথটির একটি অংশ খুঁজে পেল না।

আমি ভেবেছিলাম %AppData%আপেক্ষিক পথটি খুঁজে পাওয়া উচিত। যখন আমি যাইStart|Run|%AppData% উইন্ডোজ এক্সপ্লোরার আমাকে সেই ডিরেক্টরিতে নিয়ে যায়।

আমি পুরো পথটি রাখতে পারি না, কারণ প্রতিটি ক্লায়েন্ট মেশিনে ব্যবহারকারী আলাদা।

উত্তর:


802

অ্যাপডাটা ডিরেক্টরিটি পেতে , GetFolderPathপদ্ধতিটি ব্যবহার করা ভাল :

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

( using Systemউপস্থিত না থাকলে অবশ্যই যোগ করতে হবে )।

%AppData%পরিবেশের পরিবর্তনশীল এবং এগুলি স্বয়ংক্রিয়ভাবে .NET- এ কোথাও প্রসারিত হয় না, যদিও আপনি এটি Environment.ExpandEnvironmentVariableকরার জন্য স্পষ্টভাবে পদ্ধতিটি ব্যবহার করতে পারেন। আমি তবুও আপনাকে GetFolderPathদৃ suggest়ভাবে পরামর্শ দিচ্ছি যে আপনি তবে ব্যবহার করুন , কারণ জোহানেস রাসেল মন্তব্যে যেমন উল্লেখ করেছেন, %AppData%কিছু পরিস্থিতিতে সেট নাও করা যেতে পারে।

অবশেষে, আপনার উদাহরণে যেমন দেখানো হয়েছে তেমন পথ তৈরি করতে:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
পরিবেশের উপর নির্ভর না করে প্রকৃত সমাধান দেওয়ার জন্য +1। উত্তরে যুক্ত করতে: ফাইলের নামগুলি পরিচালনা করে এমন প্রতিটি ফাংশন পরিবেশের ভেরিয়েবলকে প্রসারিত করে না। আসলে, সাধারণত আপনাকে এটি পরিষ্কারভাবে করতে হবে, অন্যথায় এটি কাজ করে না এবং আপনি% কিছু% ফোল্ডার সমাপ্ত করবেন। তদ্ব্যতীত, পরিবেশটি উপস্থিত থাকার প্রয়োজন নেই, কিছু ক্ষেত্রে অন্য ব্যবহারকারীর অ্যাকাউন্টের অধীনে কোনও প্রোগ্রাম চলাকালীন ব্যবহারকারীর পরিবেশ লোড হবে না এবং% অ্যাপডাটা% খালি থাকবে। এজন্য আপনি এই ফোল্ডারগুলি পাওয়ার জন্য ডকুমেন্টেড এপিআইগুলি ব্যবহার করতে চাইবেন (যদি না আপনি ব্যাচের ফাইলগুলি ব্যবহার করছেন তবে)।
জোয়

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

এনভায়রনমেন্ট.গেটফোল্ডারপাথের জন্য +1 (এনভায়রনমেন্ট.স্পেশিয়াল ফোল্ডার। অ্যাপ্লিকেশনডেটা), এখন কয়েক দিন ধরে আমি এর পিছনে ছিলাম।
সুমিত ঘোষ

1
কোনও কারণে Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)আমার জন্য খালি স্ট্রিং ফিরে আসে (আইআইএস 7, ভিএস 2011)। সাইমন_উইভার সমাধান - ম্যাপিং ব্যবহার করে সমস্যার সমাধান করা MapPath
মাইক কেসকিনভ

52
অবগতির জন্য যে জন্য স্থানীয় AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData) রোমিং ডিরেক্টরির দেয়
roundcrisis

49

আপনি যদি এএসপি.এনইটি কথা বলছেন তবে পথটি আলাদা is

ASP.NET- এর জন্য / অ্যাপ_ডাটা নির্দেশ করে এমন কোনও 'স্পেশাল ফোল্ডার' মান খুঁজে পাইনি।

পরিবর্তে আপনার এটি করা দরকার:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(দ্রষ্টব্য: আপনার কোনও এমভিসি নিয়ন্ত্রকের 'কারেন্ট' সম্পত্তি দরকার নেই)

যদি আরও একটি 'বিমূর্ত' উপায় পেয়ে যায় App_Dataতবে শুনতে ভাল লাগবে।


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

7
HostingEnvironment.MapPath(@"~/App_Data")আরও ভাল এবং এমভিসি / ওয়েবএপিআই এবং ডাব্লুসিএফ উভয় প্রসঙ্গে কাজ করে যেখানে কোনও এইচটিপিপেক্সটেক্সট নেই - তবে মূল সম্পর্কে নিশ্চিত নয়
সাইমন_উইভার

36

সর্বোত্তম পথ AppData ডিরেক্টরি ব্যবহার করার IS ব্যবহার করতে Environment.ExpandEnvironmentVariableপদ্ধতি।

কারণ:

  • এটি আপনার স্ট্রিংয়ের অংশগুলিকে বৈধ ডিরেক্টরি বা যা কিছু দিয়ে প্রতিস্থাপন করে
  • এটি কেস-সংবেদনশীল
  • এটি সহজ এবং জটিল
  • এটি একটি মান
  • ব্যবহারকারীর ইনপুট নিয়ে কাজ করার জন্য ভাল

উদাহরণ:

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

মনে রাখুন কিছু ব্যবহারকারীর টাইপ %AppData%, কিছু %appdata%কিছু %APpData% আপনি দিয়ে শেষ করতে চাই না:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

এনভায়রনমেন্ট ভেরিয়েবল সেট করা না থাকলে, এটা আপনার দোষ (যখন এটি ব্যতীত নয় IS )। আমি সাধারণত মানুষ বলতে না না পুনরায় উদ্ভাবিত চাকা কিন্তু পরে আমি প্রথম অন্য উপায় গিয়ে বুঝলাম যে এটি একটি খারাপ ধারণা ছিল।


আপনার pathপরিবর্তনশীল উদাহরণগুলি পছন্দ করেছে :)
আরবিটি

+1 Environment.ExpandEnvironmentVariableসবচেয়ে ভাল তখন যখন আপনার এনভ ভার্স পাথ স্ট্রিংয়ের মধ্যে থাকে তা নির্বিশেষে কেবল প্রসারিত করতে হবে।
13:38

24

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

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

%AppData%পরিবর্তনশীল প্রসারিত ।


15

.NET2.0 এ আপনি চলকটি ব্যবহার করতে পারেন Application.UserAppDataPath


20
এটি কেবল উইনফর্মস।

7

আমি মনে করি না% অ্যাপডাটা% এর মতো স্ট্রিংয়ের কাজ করা কার্যকর হবে।

চেষ্টা

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

কারও কাছে এটির প্রয়োজন হয় সে ক্ষেত্রে আমার এমভিসি অ্যাপ্লিকেশনটিতে 'অ্যাপ_ডাটা' ফোল্ডারটি অ্যাক্সেস করার আরও একটি উপায় ভাগ করে নিতে চেয়েছিলেন।

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

সঠিক উত্তর নাও হতে পারে তবে আমি এটিই খুঁজছিলাম। +1
ডেরিক

ডাবল কোট দিয়ে একক উদ্ধৃতি প্রতিস্থাপনের পরে আমার জন্য কাজ করেছেন। Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d

1

এটি কনসোল অ্যাপ্লিকেশনটিতে আমার জন্য কাজ করছে -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

এএসপি.নেটের জন্য Load User Profileঅ্যাপ্লিকেশন পুলটিতে সেটিংটি সেট করা দরকার তবে এটি যথেষ্ট নয় that's নামে একটি গোপন সেটিংস setProfileEnvironmentরয়েছে \Windows\System32\inetsrv\Config\applicationHost.config, যা কোনও কারণে ডকুমেন্টেশনে বর্ণিত পরিবর্তে ডিফল্ট হিসাবে বন্ধ করা হয় । আপনি হয় ডিফল্ট পরিবর্তন করতে পারেন বা আপনার অ্যাপ পুল এ সেট করতে পারেন। Environmentক্লাসের সমস্ত পদ্ধতি তারপরে যথাযথ মানগুলি ফিরিয়ে দেবে।

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