คัดลอกไฟล์ลงในโฟลเดอร์แอปพลิเคชันในเวลาคอมไพล์


96

หากฉันมีไฟล์บางไฟล์ที่ต้องการคัดลอกจากโปรเจ็กต์ของฉันไปยัง.\bin\debug\โฟลเดอร์ในการคอมไพล์ดูเหมือนว่าฉันจะต้องใส่ไฟล์เหล่านั้นลงในรูทของโปรเจ็กต์ การใส่ลงในโฟลเดอร์ย่อยดูเหมือนว่าจะคัดลอกลงใน.\bin\debug\โฟลเดอร์ในโครงสร้างเดียวกับที่เก็บไว้

มีวิธีใดบ้างที่จะหลีกเลี่ยงสิ่งนี้?

เพื่อความชัดเจน: ถ้าฉันมีMyFirstConfigFile.txtและMySecondConfigFile.txtอยู่ในConfigFilesโฟลเดอร์และฉันตั้งค่าCopy เป็น Outputเป็นCopy ... สิ่งนั้นจะปรากฏใน.\bin\debug\ConfigFiles\โฟลเดอร์ ฉันต้องการให้มันปรากฏใน.\bin\debug\โฟลเดอร์

คำตอบ:


94

คุณสามารถทำได้ด้วยเหตุการณ์สร้างโพสต์ ตั้งค่าไฟล์เป็นไม่มีการดำเนินการกับคอมไพล์จากนั้นในมาโครคัดลอกไฟล์ไปยังไดเร็กทอรีที่คุณต้องการ

นี่คือโพสต์สร้างมาโครที่ฉันคิดว่าจะทำงานได้โดยการคัดลอกไฟล์ทั้งหมดในไดเร็กทอรีชื่อ Configuration ไปยังโฟลเดอร์ root build:

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

1
สำหรับปลายทางควรเป็น $ (ProjectDir) \% (OutDir) หรือไม่?
Ed Greaves

11
มาโครที่ถูกต้องและทดสอบ (Vs2010) คือ: คัดลอก "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot

คุณยังสามารถสร้างไฟล์สัมพัทธ์สำหรับเอาต์พุต: คัดลอก "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen

3
ฉันคิดว่าจำเป็นต้องใช้คำพูด:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
ใน MSVS2017 (15.4) ควรเป็น$(OutDir)(เช่นไม่มี$(ProjectDir)) ดูเหมือนว่า ... มิฉะนั้นคุณจะได้รับข้อผิดพลาดทางคู่
JHBonarius

51

คุณสามารถใช้งาน MSBuild บน csproj ของคุณได้เช่นนั้น

แก้ไขไฟล์ csproj ของคุณ

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

นี่เป็นทางออกที่ดีที่สุดเนื่องจากคุณสามารถใช้สัญลักษณ์แทนเพื่อคัดลอกไฟล์จำนวนมากและไม่จำเป็นต้องอยู่ในโครงการ
Chris Bordeman

38

คุณยังสามารถใส่ไฟล์หรือลิงก์ลงในรูทของตัวสำรวจโซลูชันจากนั้นตั้งค่าคุณสมบัติของไฟล์:

Build action = Content

และ

Copy to Output Directory = Copy if newer (ตัวอย่างเช่น)

สำหรับลิงก์ให้ลากไฟล์จาก windows explorer ไปยังโซลูชัน explorer กดปุ่ม shift และ control ค้างไว้

ป้อนคำอธิบายภาพที่นี่


3
สิ่งนี้จะรักษาเส้นทางสัมพัทธ์ดั้งเดิมซึ่งไม่สามารถยอมรับได้สำหรับ OP
jlee

หากคุณใส่ไฟล์ลงในโหนดระดับบนสุดของโปรเจ็กต์ของคุณไฟล์นั้นจะถูกคัดลอกลงในโฟลเดอร์เอาต์พุต $ (OutputPath) โดยตรง
Georg

1
ดูโพสต์นี้สำหรับทางเลือกที่ยอมรับได้
Zoey Hewll

5

โดยส่วนตัวฉันชอบวิธีนี้

แก้ไข.csprojเพื่อเพิ่ม

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

1
ในความคิดของฉันดีกว่าเหตุการณ์หลังการสร้าง ขอบคุณ!
khlr

นี่ไม่ใช่แค่การคลิกขวาที่โปรเจ็กต์แล้วเลือก "เพิ่ม | รายการที่มีอยู่" จาก Solution Explorer จากนั้นตั้งค่าคุณสมบัติ File "Copy to Output Directory" เป็น "Copy if newer" ไม่จำเป็นต้องแก้ไข XML โดยตรง
Antony Booth

1
@AntonyBooth หลังจากนั้นไม่นานคุณจะรู้ว่ามันง่ายกว่าที่จะเข้าใจสิ่งที่เกิดขึ้นและแก้ไขโค้ดโดยตรงแทนที่จะเรียนรู้วิธีทำสิ่งเดียวกันกับ IDE ของคุณ วันนี้คุณใช้ Visual Studio พรุ่งนี้อาจเป็น JetBrains Rider และวันมะรืน VS Code ในตอนท้ายคุณจะเชี่ยวชาญภาษามากกว่า IDE เสมอ PS: ฉันไม่รู้ว่าสิ่งที่คุณอธิบายนั้นเหมือนกันหรือไม่เนื่องจากฉันรู้วิธีการทำใน XML เท่านั้นดีกว่าแบบนี้มาก
Jérôme MEVEL

นอกจากนี้ในปัจจุบันยังไม่มีวิธีกำหนดเส้นทางเป้าหมายภายใน IDE ดังนั้นในตอนนี้เราต้องแก้ไข XML
Zoey Hewll

3

คัดลอกจากโฟลเดอร์ย่อยไปยังโฟลเดอร์ย่อย

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

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

7
ยินดีต้อนรับสู่ StackOverflow และขอขอบคุณที่ร่วมให้ข้อมูล คุณได้ตอบคำถามเก่า ๆ ที่มีคำตอบที่ได้รับคะแนนโหวตสูงอยู่แล้ว หากคุณคิดว่าคำตอบของคุณมีประโยชน์นอกเหนือจากคำตอบที่ได้รับการโหวตแล้วคุณควรเพิ่มคำอธิบายเล็กน้อยว่าทำไมคำตอบของคุณจึงแก้ปัญหาได้และทำไมจึงดีกว่า / แตกต่างจากคำตอบอื่น ๆ
Matthijs Wessels

1

คุณต้องการใช้เหตุการณ์หลังการสร้างในโครงการของคุณ คุณสามารถระบุเอาต์พุตที่นั่นและมีค่ามาโครสำหรับสิ่งที่ใช้บ่อยเช่นเส้นทางโครงการชื่อรายการ ฯลฯ


0

คุณสามารถใช้เหตุการณ์ PostBuild ของโครงการ หลังจากสร้างเสร็จคุณสามารถเรียกใช้ไฟล์แบตช์ DOS และคัดลอกไฟล์ที่ต้องการไปยังโฟลเดอร์ที่คุณต้องการ


0

ฉันพบคำถามนี้โดยค้นหา "คัดลอกไฟล์ไปยังโฟลเดอร์แอปพลิเคชันในเวลาคอมไพล์" ดูเหมือนว่า OP จะจัดเรียงไว้แล้ว แต่ถ้าคุณไม่ทำ:

ใน Visual Studio ให้คลิกขวาที่ไฟล์เลือกคุณสมบัติจากนั้นเปลี่ยนตัวเลือก 'คัดลอกเพื่อส่งออก' เป็น 'เสมอ' โปรดดูhttp://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP ขอให้คัดลอกเพื่อคอมไพล์ไดเร็กทอรีโดยไม่เก็บโครงสร้างไดเร็กทอรีสัมพัทธ์ของตำแหน่งไฟล์ที่คัดลอก
Áxel Costas Pena
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.