2011-01-06 19 views
12

द्वारा उपयोग के लिए web.config में सापेक्ष फ़ाइल स्थान निर्दिष्ट करना web.config ऐप सेटिंग्स में फ़ाइल स्थान निर्दिष्ट करने का एक तरीका खोजने के लिए संघर्ष कर रहा हूं जो हार्ड-कोड किए गए पथों का उपयोग करने से बचाता है लेकिन एक गैर-'जागरूक जागरूक' फ़ाइल खोजने के लिए सी # लाइब्रेरी।मानक सी # कक्षा पुस्तकालय

सी # लाइब्रेरी डेटा फ़ाइल पर संचालित करने के लिए मानक File.Open, File.Exists विधियों आदि का उपयोग करता है, जो मेरे वेब एप्लिकेशन (एएसपी.नेट एमवीसी) पेड़ में संग्रहीत है, उदाहरण के लिए के तहत:

\content\data\MyDataFile.txt 

आवश्यकताएँ:

 
     <appSettings> 
this-->  <add key="MyFileLocation" value="~\content\data\MyDataFile.txt" /> 
not -->  <add key="MyFileLocation" value="c:\inetpub\wwwroot\foo\content\data\MyDataFile.txt" /> 
     </appSettings> 
  • मैं सी # पुस्तकालय नहीं करना चाहती:

    • मैं तरह मेरे पथ निर्दिष्ट करने के लिए, उदाहरण के लिए सक्षम होना चाहते हैं उस वेब एप्लिकेशन से अवगत रहें जिसका उपयोग किया जा रहा है, क्योंकि इसका उपयोग अन्य सॉफ़्टवेयर में किया जाता है, और वेब एप्लिकेशन को सी # लिब्रा की कॉन्फ़िगरेशन के बारे में जानने की आवश्यकता नहीं है ry तो यदि संभव हो तो मैं परतों के बीच वास्तव में कॉन्फ़िगरेशन जानकारी पास नहीं करना चाहता हूं।

    कोई सुझाव है कि मैं इसे कैसे साफ कर सकता हूं? धन्यवाद!

उत्तर

23

आप Path.Combine का उपयोग AppDomain.CurrentDomain.BaseDirectory और अपने सापेक्ष पथ को गठबंधन करने के लिए कर सकते हैं।

यह आपको ASP.NET रूट निर्देशिका (~ /) से संबंधित एएसपी.NET ऐप, या WinForms या कंसोल एप्लिकेशन में निष्पादन योग्य निर्देशिका से संबंधित पथ से संबंधित पथ देगा।

+0

बस इसे भी खोजा लेकिन मैं आपको अंक दूंगा! निश्चित रूप से मेरे मामले में काम करता है (और एक कंसोल ऐप में मैंने परीक्षण करने के लिए खटखटाया)। कोई विचार अगर कोई मामला है तो यह असफल हो जाएगा? धन्यवाद। –

-1

अगर आप

File.Open(@"content\data\file.txt") 

इसे क्रियान्वित विधानसभा स्थान के सापेक्ष किया जाएगा।

+6

जो वेब अनुप्रयोग के मामले में आमतौर पर 'c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ अस्थायी एएसपी.नेट फ़ाइलें 'हो सकता है जो लगभग हमेशा इच्छित नहीं है। –

+1

-1 - यह गलत है, यह वर्तमान कार्यशील निर्देशिका के सापेक्ष होगा - यदि आईआईएस के तहत चल रहा है या दृश्य स्टूडियो के तहत चल रहे कैसिनी वेब सर्वर वाली निर्देशिका में% WINDIR% \ system32 \ inetsrv हो सकता है। मौजूदा कामकाजी निर्देशिका के बारे में धारणाएं बनाना आम तौर पर एक अच्छा विचार नहीं है। – Joe

4

वेब एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल से पथ क्यों नहीं पढ़ता है, सर्वर.मैपपाथ का उपयोग करके इसे हल करें, फिर क्लास लाइब्रेरी के परिणामस्वरूप पथ को पास करें?


आपकी टिप्पणी के आधार पर, मेरे पास एक अलग सुझाव है: सापेक्ष पथ का उपयोग न करें।

+0

हां, मैंने ऐसा माना है लेकिन ऐसा करने में अनिच्छुक है क्योंकि यह मेरे ऐप में चिंताओं को अलग करता है; इसके लिए मेरे वेब ऐप को लाइब्रेरी की कॉन्फ़िगरेशन में शामिल करने की आवश्यकता होगी (जिसे इंटरफेस के माध्यम से एक्सेस किया जाता है, इसलिए इसे बाद में बदल दिया जा सकता है)। –

+0

@ टिम: आपका वेब ऐप कॉन्फ़िगरेशन के लिए पहले से ही ज़िम्मेदार है कि कॉन्फ़िगरेशन मान वेबसाइट के साथ ही संग्रहीत किए जाते हैं। इसके अलावा वेब ऐप स्पष्ट रूप से असेंबली को कॉल करता है (यह सब के बाद अकेला नहीं है)। "अलग" होने के लिए यह गलत "चिंता" है। – NotMe

+0

@ क्रिस: वेब एप्लिकेशन द्वारा बुलाए गए सभी असेंबली के लिए सेटिंग्स web.config में संग्रहीत हैं। इस तरह .NET काम करता है - प्रति ऐपडोमेन में केवल एक कॉन्फ़िगरेशन फ़ाइल। पुस्तकालय के मार्ग को पारित करना उचित नहीं है, क्योंकि अलग-अलग पुस्तकालयों में अलग-अलग पथ या अन्य कॉन्फ़िगरेशन हो सकते हैं। –

0

उदाहरण

के लिए अपने web.config

<appSettings> 
     <add key="FilePath" value="~/images"/> 
    </appSettings> 

में और .cs के पीछे अपने कोड में दाखिल

string filters = "*.jpg;*.png;*.gif"; 
    string Path = ConfigurationManager.AppSettings["FilePath"].ToString(); 

    List<String> images = new List<string>(); 

    foreach (string filter in filters.Split(';')) 
    { 
     FileInfo[] fit = new DirectoryInfo(this.Server.MapPath("~/images")).GetFiles(filter); 
     foreach (FileInfo fi in fit) 
     { 
      images.Add(String.Format(Path + "/{0}", fi));     
     } 
    } 

    RepeaterImages.DataSource = images; 
    RepeaterImages.DataBind(); 
0

तुम भी ऐसा कर सकता है:

वेब में। कॉन्फ़िगरेशन:

<add key="MyFileLocation" value="content/dataMyDataFile.txt" /> 

अपने कोड में:

string filePath = ConfigurationManager.AppSettings["MyFileLocation"]; 
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath) 

परिणाम की तरह कुछ दे देंगे: "C: \ yourproj \ सामग्री \ dataMyDataFile" या ऐसा ही कुछ।

संबंधित मुद्दे