Gå til innhold

Kopier filer og mapper


Anbefalte innlegg

Hei. Etter å ha googlet litt og i grunn ikke fått noe godt svar på det jeg lurte på så spørr jeg her.

 

Jeg har en mappe som inneholder filer og andre mapper. Det jeg ønsker er å kopiere filene og mappene til en annen mappe. Slik at vi altså får to mapper med identisk innhold.

 

Så hvordan burde jeg gå frem for å gjøre dette enklest mulig? Har sett noen som bruker system-command, men det virker rart. Finnes det noen innebygde funksjoner for dette?

 

Også, finnes det en rask og enkel måte for å liste opp alle filer og mapper i en mappe? Noe som ligner dir() i php.

Lenke til kommentar
Videoannonse
Annonse

Viss du ikke har programmert i C/C++,er python et bedere valg for dette.

Eller som GeirGrusom bash/cmd/powershell.

Jeg bruker python til det meste,ettersom det er språket jeg liker klart best.

jeg har en mappe som inneholder filer og andre mapper. Det jeg ønsker er å kopiere filene og mappene til en annen mappe. Slik at vi altså får to mapper med identisk innhold.

Denne kommadoen gjør akkurat det du ønsker

distutils.dir_util.copy_tree

 

import os
import distutils.dir_util

distutils.dir_util.copy_tree('c:/test', 'c:/testbak')

 

Også, finnes det en rask og enkel måte for å liste opp alle filer og mapper i en mappe? Noe som ligner dir() i php.

import os
print os.listdir('c:/test')
#Lister opp alle filer og mapper i c:\test

Endret av SNIPPSAT
Lenke til kommentar

Du burde ha en god grunn til å gjøre dette i C++ istedet for å merke alle mapper og trykke Ctrl+C, eventuelt bash/cmd/powershell.

Ellers er slikt individuelt for forskjellige operativsystemer.

 

Nei geir, jeg er bare lei av å måtte kopiere filer manuelt. Selvfølgelig har jeg en god grunn, dette er del av et litt større prosjekt jeg driver med.

 

SNIPPSAT: Bruker c++ fordi det er det språket jeg kan, er mulig det kan gjøres lettere i python og jeg har lyst til å lære meg det, så kanskje jeg skulle se på mulighetene der.

Et spørsmål, hvordan kjører du python aplikasjoner? Brukervendlighet er et stikkord her.

Lenke til kommentar
hvordan kjører du python aplikasjoner? Brukervendlighet er et stikkord her.

Installere python 2.6.5

http://www.python.org/download/

 

IDLE (Python GUI)

Fil->new vindow

Lim inn koden og run(F5)

 

Fra cmd.

python kode_navn.py

 

Dobbelklikk på .py ser man som regel ikke hva koden gjør.

Vinduet blir borte,kan legge inn raw_input('Press any key to quit')

 

Pyscripter installere og lim inn koden,trykk på run knappen en enkel og god editor.

http://code.google.com/p/pyscripter/

Endret av SNIPPSAT
Lenke til kommentar

Installere python 2.6.5

http://www.python.org/download/

 

Da er python ute av bilde, dette er myntet på noen som ikke har mye data erfaring og jeg ønsker ikke at de må instalere en hel haug med tull. Tregner forresten en del andre funksjoner som jeg er sikker på at c++ har og som jeg har løsninger for. Får vel bare forsette å google. Poster løsningen her om jeg finner den.

Lenke til kommentar

Hvis Windows er eneste kravet, så kan du kikke på Directory og Filbehandlingsfunksjonene for det. Du må etter det jeg vet, kopiere en og en fil, og opprette mapper. (eventuelt bruke system-kommandoen og robocopy, eller xcopy dersom Windows XP eller eldre brukes)

Dersom du går for systemkallene er det vanlig å lage en liste over alle filer som skal kopieres før kopieringen startes, ettersom dette fører til at du lett kan regne ut hvor lang tid det tar, og selve kopieringen kan gjøres iterativt.

Merk at dersom du går for system kommandoen, anbefales det at du bruker robocopy fremfor xcopy fordi xcopy ikke støtter filbaner over 256 tegn. For Windows API skal det ikke være noen begrensning.

 

edit: hvis du kan fortelle litt mer om prosjektet så kanskje vi kan anbefale andre verktøy som kan brukes? Dersom Windows brukes, kan kanskje et .NET språk være et alternativ, eventuelt kanskje Java ettersom de aller fleste allerede har Java tilgjengelig på maskinen fra før (men det er ingen selvfølge)

.NET følger med Windows ofte, men det kan være lurt å sjekke om brukeren allerede har det, ettersom noen enten fjerner .NET eller huker det vekk fra Windows Update. Windows Vista og Windows 7 har .NET 3.5 preinstallert, I Windows XP tror jeg 2.0 følger med SP3, men jeg er usikker.

De fleste andre API-er enn C++ har filbehandling i standardbiblioteket.

Endret av GeirGrusom
Lenke til kommentar

edit: hvis du kan fortelle litt mer om prosjektet så kanskje vi kan anbefale andre verktøy som kan brukes? Dersom Windows brukes, kan kanskje et .NET språk være et alternativ, eventuelt kanskje Java ettersom de aller fleste allerede har Java tilgjengelig på maskinen fra før (men det er ingen selvfølge)

.NET følger med Windows ofte, men det kan være lurt å sjekke om brukeren allerede har det, ettersom noen enten fjerner .NET eller huker det vekk fra Windows Update. Windows Vista og Windows 7 har .NET 3.5 preinstallert, I Windows XP tror jeg 2.0 følger med SP3, men jeg er usikker.

De fleste andre API-er enn C++ har filbehandling i standardbiblioteket.

 

Har tenkt på Java, siden det er så enkelt å greit. Grunnen til at jeg startet med C++ er at det var det verktøyet jeg hadde klart. Fant en CopyFile() som skal fungere for Windows, men det virker som om Windows ikke stoler på programmet mitt eller at kommandon ikke støttes for Win7.

 

Prosjektet er følgende: Jeg ønsker en rask og lett måte for å kopiere over filer til mange USB minnepinner. Ved hjelp av en USB-hub kan jeg koble en del til datan samtidig så nå mangler bare programmet. Da skjønner dere kanskje at kopieringen bare er en liten del av haugen, jeg må også finne en god måte for å fortelle programmet hvilke disk den skal kopiere til.

 

La oss si at vi setter inn to minnepenner, J: og H:, da vil jeg kun kopiere til J og H. Har tenkt på en måte å gjøre dette automatisk, men jeg tror jeg ender opp med at brukeren må skrive inn hvilke disker filene skal kopieres til.

 

Det er vedlig viktig å oppretholde mappestruktur.

Lenke til kommentar
Da er python ute av bilde, dette er myntet på noen som ikke har mye data erfaring og jeg ønsker ikke at de må instalere en hel haug med tull. Tregner forresten en del andre funksjoner som jeg er sikker på at c++ har og som jeg har løsninger for. Får vel bare forsette å google. Poster løsningen her om jeg finner den.

Det går greit og gjør om .py filer til exe med py2exe

Da kan man gi ut en exe-fil eller en setup-fil(viss man bruker inno-setup),som begge virker uten noe pre-installed.

 

Dette bør være en grei oppgave i de fleste språk.

 

Batch.

http://en.kioskea.net/forum/affich-30405-creating-a-batch-file-to-copy-a-directory

 

C++

http://www.gamedev.net/community/forums/topic.asp?topic_id=399558

http://www.cplusplus.happycodings.com/Algorithms/code38.html

http://www.daniweb.com/forums/thread125446.html

Endret av SNIPPSAT
Lenke til kommentar

CopyFile funksjonen fungerer ikke helt som jeg skulle ønske eller for å si det sånn den fungerer ikke i det hele tatt. Selve funksjonen er nok grei, men det virker som om den ikke får tilgang til filen av Windows. Selv om jeg har gitt programmet 100% tilit.

Lenke til kommentar

slik kopierer du en fil til en annen i c++

#include <ftsream>
int main()
{
std::ifstream in ("oldfile.txt"); // open original file
std::ofstream out("newfile.txt"); // open target file
out << in.rdbuf(); // read original file into target
out.close(); // explicit close, unnecessary in this case
in.close();// explicit close, unnecessary in this case
}

 

for å kopiere et directory, må du traversere alt i directoriet. her er det nok lurt med en rekusiv funksjon. (hente fillister for directory er OS spesifik, windows og linux har forskjellige api'er her)

 

Men jeg vil heller spare deg for det og guide deg til boost med en gang.

 

http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm

 

Ta spesiellt en god titt på find_file eksempelet (da du må gjøre ting på en tilsvarende måte.. Men istede for å sjekke filnavnet, kopiere det et annet sted).

Lenke til kommentar

Jeg tror det er bedre å la operativsystemet behandle kopiering av filer ettersom den kan bruke optimaliserte løsninger som memory mapping og lignende, fremfor å manuelt skrive filene på nytt.

Bare min mening da.

 

jau, helt enig. Men la inn et forslag for programatisk løsning.

 

Personlig ville jeg bruke system("cp/copy/rsync/etc");

 

det går jo an å lese resultatet av et system call, så du vet om det succeded eller ikke også.

Lenke til kommentar
' date='11. juni 2010 - 17:20' timestamp='1276269654' post='15789398']

Jeg tror det er bedre å la operativsystemet behandle kopiering av filer ettersom den kan bruke optimaliserte løsninger som memory mapping og lignende, fremfor å manuelt skrive filene på nytt.

Bare min mening da.

 

jau, helt enig. Men la inn et forslag for programatisk løsning.

 

Personlig ville jeg bruke system("cp/copy/rsync/etc");

 

det går jo an å lese resultatet av et system call, så du vet om det succeded eller ikke også.

Det er jo helt klart den enkleste løsningen også.

Lenke til kommentar
Personlig ville jeg bruke system("cp/copy/rsync/etc");

Bruke operativsystemet er helt klar en grei løsning som GeirGrusom var inne på.

rsync er da en linux løsning,det går og installere rsync for og få den funksjonen i windows.

 

system() call er nogenlunde likt i C++ og python.

 

#include <iostream>
using namespace std;

int main ()
{
   system("Do system call");
}

#Python
import os
os.system('do system call')

#Bare en test med gamle xcopy,som fungerer greit
#Viss man ikke har filbaner på over over 256 tegn

#include <iostream>
using namespace std;

int main ()
{
   system("xcopy /S /E E:\\dir1 E:\\dir2");
}

#Python
import os
os.system("xcopy /S /E E:\\dir1 E:\\dir2")

Lenke til kommentar

Personlig ville jeg bruke system("cp/copy/rsync/etc");

 

det går jo an å lese resultatet av et system call, så du vet om det succeded eller ikke også.

 

... som er dessverre skikkelig, skikkelig pes, dersom man skal gjøre det helt riktig (tips: filnavn kan inneholde fryktelig mye rart. Quoting blir ikke helt trivielt å gjøre riktig).

 

Boost må ha noe for dette?

 

edit: Åh, dette må være definisjonen på ironi -- søppelforumprogramvaren takler ikke '[' i "kami" sitt navn.

Endret av zotbar1234
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...