संकलन समय पर एप्लिकेशन फ़ोल्डर में फ़ाइलों की प्रतिलिपि बनाना


93

अगर मेरे पास कुछ फाइलें हैं जो मैं अपने प्रोजेक्ट से .\bin\debug\संकलन पर फ़ोल्डर में कॉपी करना चाहता हूं , तो ऐसा लगता है कि मुझे उन्हें प्रोजेक्ट की जड़ में डालना होगा। उन्हें एक सबफ़ोल्डर में डालकर उन्हें .\bin\debug\उसी संरचना में फ़ोल्डर में कॉपी करना प्रतीत होता है , जिसमें वे संग्रहीत हैं।

क्या इससे बचने का कोई तरीका है?

बस स्पष्ट होना: अगर मैं एक है MyFirstConfigFile.txtऔर MySecondConfigFile.txtएक में ConfigFilesफ़ोल्डर और मैं उनके सेट आउटपुट को कॉपी होने की कॉपी ... , तो वे में दिखाई देते हैं .\bin\debug\ConfigFiles\फ़ोल्डर। मैं चाहता हूं कि वे .\bin\debug\फ़ोल्डर में दिखाई दें ।

जवाबों:


91

आप इसे पोस्ट बिल्ड ईवेंट के साथ कर सकते हैं। फ़ाइलों को संकलित करने के लिए कोई कार्रवाई करने के लिए सेट करें, फिर मैक्रो में फ़ाइलों को उस निर्देशिका में कॉपी करें जो आप चाहते हैं।

यहाँ एक पोस्ट बिल्ड मैक्रो है जो मुझे लगता है कि रूट बिल्ड फ़ोल्डर में कॉन्फ़िगरेशन नामक एक निर्देशिका में सभी फ़ाइलों को कॉपी करके काम करेगा:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)

1
गंतव्य के लिए, यह $ (ProjectDir) \% (OutDir) नहीं होना चाहिए?
एड ग्रीव्स

11
सही और परीक्षण किया गया (Vs2010) मैक्रो है: कॉपी "$" (प्रोजेक्टडिअर) फायरबर्ड \ फायरबर्ड_बिन * "" $ (प्रोजेक्टडिअर) $ (आउटडिर) "
एरिक बोले-फीएटस

तुम भी उत्पादन के लिए एक रिश्तेदार फ़ाइल कर सकते हैं: कॉपी "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen

3
मुझे लगता है कि उद्धरणों का उपयोग आवश्यक है:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
MSVS2017 (15.4) में यह बस होना चाहिए $(OutDir)(यानी बिना $(ProjectDir)) ऐसा लगता है ... वरना आपको डबल पाथ एरर
मिलते

51

आप अपने csproj पर MSBuild कार्य का उपयोग कर सकते हैं, जैसे।

अपनी csproj फ़ाइल संपादित करें

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>

यह सबसे अच्छा समाधान है क्योंकि आप वाइल्डकार्ड का उपयोग कई फ़ाइलों की प्रतिलिपि बनाने के लिए कर सकते हैं, और उन्हें परियोजना में होने की आवश्यकता नहीं है।
क्रिस बॉर्डमैन

37

तुम भी समाधान एक्सप्लोरर की जड़ में फ़ाइलों या लिंक डाल सकते हैं और फिर फाइल गुण सेट करें:

Build action = Content

तथा

Copy to Output Directory = Copy if newer (उदाहरण के लिए)

एक लिंक के लिए शिफ्ट एक्सप्लोरर को विंडो एक्सप्लोरर से शिफ्ट और कंट्रोल कीज़ में दबाकर रखें।

यहां छवि विवरण दर्ज करें


3
यह मूल सापेक्ष पथ को संरक्षित करेगा, जो ओपी के लिए स्वीकार्य नहीं है
जले

यदि आप फ़ाइल को अपनी परियोजना के शीर्ष स्तर के नोड में रखते हैं, तो इसे सीधे आउटपुट फ़ोल्डर $ (आउटपुटपाथ) में कॉपी किया जाएगा।
जॉर्ज

3

सबफ़ोल्डर से सबफ़ोल्डर में कॉपी करें

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"

7
StackOverflow में आपका स्वागत है और योगदान के लिए धन्यवाद। आपने एक बहुत पुराने प्रश्न का उत्तर दिया है जिसमें पहले से ही उच्च उत्कीर्ण उत्तरों का एक समूह है। यदि आपको लगता है कि आपका उत्तर मौजूदा उत्कीर्ण उत्तरों के अतिरिक्त उपयोगी है, तो आपको इस बात की थोड़ी व्याख्या करनी चाहिए कि आपका उत्तर समस्या का समाधान क्यों करता है और यह दूसरों से बेहतर / अलग क्यों है।
मथिज्स वेसल्स

3

व्यक्तिगत रूप से मैं इस तरह से पसंद करता हूं।

.csprojजोड़ने के लिए संशोधित करें

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

1
मेरी राय में पोस्ट-बिल्ड इवेंट इवेंट से बेहतर है। धन्यवाद!

क्या यह परियोजना को राइट-क्लिक करने और समाधान एक्सप्लोरर से "जोड़ें | मौजूदा आइटम" का चयन करने के समान नहीं है, फिर फ़ाइल संपत्ति "कॉपी टू आउटपुट आउटपुट निर्देशिका" को "कॉपी करें यदि नया" सेट करें। XML को सीधे संशोधित करने की कोई आवश्यकता नहीं है।
एंटनी बूथ

@AntonyBooth थोड़ी देर के बाद आपको एहसास होगा कि यह समझना हमेशा आसान है कि क्या हो रहा है और कोड को सीधे संशोधित करने के बजाय यह सीखें कि अपने आईडीई के साथ एक ही काम कैसे करें। आज आप विजुअल स्टूडियो का उपयोग कर रहे हैं, कल यह JetBrains Rider हो सकता है और कल के VS कोड के अगले दिन। अंत में, आप हमेशा IDE के बजाय किसी भाषा में बेहतर महारत हासिल करते हैं। पुनश्च: मुझे नहीं पता कि आप जो वर्णन करते हैं वह वही है क्योंकि मैं केवल एक्सएमएल में इसे करना जानता हूं, इस तरह से बहुत बेहतर है।
Jérôme MEVEL

1

आप अपने प्रोजेक्ट पर पोस्ट-बिल्ड इवेंट का उपयोग करना चाहते हैं। आप वहां आउटपुट को निर्दिष्ट कर सकते हैं और अक्सर इस्तेमाल की जाने वाली चीजों जैसे प्रोजेक्ट पथ, आइटम का नाम, आदि के लिए मैक्रो मान हैं।


0

आप प्रोजेक्ट के PostBuild इवेंट का उपयोग कर सकते हैं। बिल्ड के पूरा होने के बाद, आप डॉस बैच फ़ाइल चला सकते हैं और वांछित फ़ाइलों को अपने वांछित फ़ोल्डर में कॉपी कर सकते हैं।


0

मुझे यह प्रश्न "संकलन समय पर अनुप्रयोग फ़ोल्डर में फ़ाइलों की प्रतिलिपि" खोजने के लिए मिला। ओपी लगता है कि यह पहले से ही हल है, लेकिन अगर आप नहीं करते हैं:

Visual Studio में फ़ाइल को राइट-क्लिक करें, गुण चुनें, फिर विकल्प 'कॉपी टू आउटपुट' को 'हमेशा' में बदलें। Http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx देखें


5
ओपी कॉपी किए गए फ़ाइल स्थान की सापेक्ष निर्देशिका संरचना को ध्यान में रखते हुए निर्देशिका संकलित करने के लिए पूछता है
Costxel कोस्टास पेना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.