Kopiowanie plików do folderu aplikacji w czasie kompilacji


95

Jeśli mam jakieś pliki, które chcę skopiować z mojego projektu do .\bin\debug\folderu podczas kompilacji, wydaje się, że muszę je umieścić w katalogu głównym projektu. Umieszczenie ich w podfolderze wydaje się kopiować je do .\bin\debug\folderu w tej samej strukturze, w której są przechowywane.

Czy jest sposób, aby tego uniknąć?

Dla jasności: jeśli mam MyFirstConfigFile.txti MySecondConfigFile.txtw ConfigFilesfolderze i ustawię ich Copy to Output na Copy ... , pojawią się w .\bin\debug\ConfigFiles\folderze. Chcę, aby pojawiły się w .\bin\debug\folderze.

Odpowiedzi:


93

Możesz to zrobić za pomocą zdarzenia po kompilacji. Ustaw pliki na brak akcji podczas kompilacji, a następnie w makrze skopiuj pliki do odpowiedniego katalogu.

Oto makro po kompilacji, które moim zdaniem zadziała, kopiując wszystkie pliki z katalogu o nazwie Konfiguracja do głównego folderu kompilacji:

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

1
Czy w przypadku miejsca docelowego nie powinien to być $ (ProjectDir) \% (OutDir)?
Ed Greaves

11
Poprawne i przetestowane makro (Vs2010) to: copy "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot

Możesz również po prostu zrobić plik względny do wyjścia: skopiuj "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen

3
Myślę, że użycie cytatów jest konieczne:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
Wydaje się, że w MSVS2017 (15.4) powinno być $(OutDir)(tj. Bez $(ProjectDir)) ... w przeciwnym razie otrzymujesz błędy podwójnej ścieżki
JHBonarius

51

Możesz użyć zadania MSBuild na swoim csproj, w ten sposób.

Edytuj swój plik csproj

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

Jest to najlepsze rozwiązanie, ponieważ do kopiowania wielu plików można używać symboli wieloznacznych i nie muszą one znajdować się w projekcie.
Chris Bordeman

38

Możesz również umieścić pliki lub łącza w katalogu głównym eksploratora rozwiązań, a następnie ustawić właściwości plików:

Build action = Content

i

Copy to Output Directory = Copy if newer (na przykład)

Aby uzyskać łącze, przeciągnij plik z eksploratora Windows do eksploratora rozwiązań, przytrzymując klawisz Shift i Control.

wprowadź opis obrazu tutaj


3
Pozwoli to zachować oryginalną ścieżkę względną, która nie jest akceptowana dla OP
jlee

Jeśli umieścisz plik w węźle najwyższego poziomu projektu, zostanie on skopiowany bezpośrednio do folderu wyjściowego $ (OutputPath).
Georg

1
Zobacz ten post, aby
poznać

5

Osobiście wolę ten sposób.

Zmodyfikuj, .csprojaby dodać

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

1
Moim zdaniem o wiele lepsze niż wydarzenie post-build. Dziękuję Ci!
khlr

Czy to nie to samo, co kliknięcie projektu prawym przyciskiem myszy i wybranie opcji „Dodaj | istniejący element” w Eksploratorze rozwiązań, a następnie ustawienie właściwości pliku „Kopiuj do katalogu wyjściowego” na „Kopiuj, jeśli nowszy”. Nie ma potrzeby bezpośredniego modyfikowania XML.
Antony Booth

1
@AntonyBooth po chwili zdasz sobie sprawę, że zawsze łatwiej jest zrozumieć, co się dzieje i zmodyfikować kod bezpośrednio, zamiast uczyć się, jak zrobić to samo ze swoim IDE. Dziś używasz Visual Studio, jutro może to być JetBrains Rider, a pojutrze VS Code. Na koniec zawsze lepiej opanujesz język niż IDE. PS: Nie wiem, czy to, co opisujesz, jest takie samo, ponieważ wiem tylko, jak to zrobić w XML, o wiele lepiej.
Jérôme MEVEL

Ponadto nie ma obecnie możliwości ustawienia ścieżki docelowej w IDE, więc na razie musimy edytować XML.
Zoey Hewll

3

skopiuj z podfolderu do podfolderu

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

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

7
Witamy w StackOverflow i dziękujemy za wkład. Odpowiedziałeś na naprawdę stare pytanie, które ma już kilka bardzo pozytywnych odpowiedzi. Jeśli uważasz, że twoja odpowiedź jest przydatna oprócz istniejących zaopiniowanych odpowiedzi, powinieneś dodać małe wyjaśnienie, dlaczego twoja odpowiedź rozwiązuje problem i dlaczego jest lepsza / różni się od innych.
Matthijs Wessels

1

Chcesz użyć wydarzenia Post-Build w swoim projekcie. Możesz tam określić dane wyjściowe i istnieją wartości makr dla często używanych rzeczy, takich jak ścieżka projektu, nazwa elementu itp.


0

Możesz użyć zdarzenia PostBuild projektu. Po zakończeniu kompilacji możesz uruchomić plik wsadowy DOS i skopiować żądane pliki do żądanego folderu.


0

Znalazłem to pytanie podczas wyszukiwania hasła „skopiuj pliki do folderu aplikacji w czasie kompilacji”. Wygląda na to, że OP już to załatwiło, ale jeśli nie:

W programie Visual Studio kliknij plik prawym przyciskiem myszy, wybierz właściwości, a następnie zmień opcję „kopiuj na dane wyjściowe” na „zawsze”. Zobacz http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP prosi o skopiowanie do katalogu kompilacji bez zachowania względnej struktury katalogów lokalizacji skopiowanego pliku
Áxel Costas Pena,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.