Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 22:57 Der er 14 kommentarer og
1 løsning

Kopiere også undermapper ?

Hejza allesammen.

Jeg fik denne kode af arne v, og syntes ikke jeg kunne presse flere ting ud af hans 50 pionts :) ...

#include <stdio.h>

#include <windows.h>

void copy(char*fnm, char *fradir, char*tildir)
{
  char fullfra[MAX_PATH],fulltil[MAX_PATH];
  if(fnm[0]!='.')
  {
      sprintf(fullfra,"%s%s",fradir,fnm);
      sprintf(fulltil,"%s%s",tildir,fnm);
      CopyFile(fullfra,fulltil,0);
  }
}

int main()
{
  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile("C:\\tester\\mappe1\\*.*",&data);
  if(h!=INVALID_HANDLE_VALUE) {
    copy(data.cFileName,"C:\\tester\\mappe1\\","C:\\tester\\mappe1\\");
    while(FindNextFile(h,&data)) {
        copy(data.cFileName,"C:\\tester\\mappe1\\","C:\\tester\\mappe2\\");
    }
  }
  FindClose(h);
  return 0;
}

Nu vil jeg gerne have den til at kopirer mapper og undermapper med også.
Og hvis den støder på en fil som har samme filnavn skal den ikke gøre noget..

Kan nogen hjælpe med det ?

På forhånd tak.
Avatar billede arne_v Ekspert
25. september 2004 - 23:16 #1
Her er en løsning som ser ud til at virke:

#include <stdio.h>
#include <stdlib.h>

#include <windows.h>

void copy_recursive(char *fradir, char* tildir);

void copy(WIN32_FIND_DATA *fnddat, char *fradir, char*tildir)
{
  char fullfra[MAX_PATH],fulltil[MAX_PATH];
  if(fnddat->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  {
      if(fnddat->cFileName[0]!='.')
      {
        sprintf(fullfra,"%s%s\\",fradir,fnddat->cFileName);
        sprintf(fulltil,"%s%s\\",tildir,fnddat->cFileName);
        CreateDirectory(fulltil,NULL);
        copy_recursive(fullfra,fulltil);
      }
  }
  else
  {
      sprintf(fullfra,"%s%s",fradir,fnddat->cFileName);
      sprintf(fulltil,"%s%s",tildir,fnddat->cFileName);
      CopyFile(fullfra,fulltil,0);
  }
}

void copy_recursive(char *fradir, char*tildir)
{
  WIN32_FIND_DATA data;
  char spec[MAX_PATH];
  sprintf(spec,"%s*.*",fradir);
  HANDLE h = FindFirstFile(spec,&data);
  if(h!=INVALID_HANDLE_VALUE) {
    copy(&data,fradir,tildir);
    while(FindNextFile(h,&data)) {
      copy(&data,fradir,tildir);
    }
  }
  FindClose(h);
}

int main()
{
  copy_recursive("C:\\fradir\\","C:\\tildir\\");
  return 0;
}
Avatar billede arne_v Ekspert
25. september 2004 - 23:17 #2
Men jeg er ikke tilfreds med koden. Det bør kunne laves bedre.
Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 23:26 #3
Den overskriver desværre filerne.. Den skal ikke gøre noget hvis den finder en med samme navn.. kan man det ?
Avatar billede arne_v Ekspert
25. september 2004 - 23:34 #4
Bare erstat

CopyFile(fullfra,fulltil,0);

med

CopyFile(fullfra,fulltil,1);
Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 23:36 #5
sejt takker...

Da jeg er løbet tør for points, må jeg så spørger dig noget om arrays?
Avatar billede arne_v Ekspert
25. september 2004 - 23:37 #6
Ja da
Avatar billede bertelbrander Novice
25. september 2004 - 23:39 #7
Jeg ved ikke om det er bedre:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>

void DoCopy(std::string aSrc, std::string aDest)
{
  if(!CopyFile(aSrc.c_str(), aDest.c_str(), false))
      fprintf(stderr, "Failed to copy: %s\n", aSrc.c_str());
  else
      printf("%s\n", aSrc.c_str());
}

void DoScan(std::string aSrc, std::string aDest)
{
  std::string SrcPattern = aSrc + "*";
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = FindFirstFile(SrcPattern.c_str(), &FindFileData);
  if (hFind == INVALID_HANDLE_VALUE)
  {
    fprintf(stderr, "Invalid File Handle. GetLastError reports %d\n", GetLastError());
    return;
  }
  else
  {
    do
    {
        if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
          CreateDirectory(aDest.c_str(), 0);
          DoCopy(aSrc + FindFileData.cFileName, aDest + FindFileData.cFileName);
        }
        else if(strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, ".."))
          DoScan(aSrc + std::string(FindFileData.cFileName) + "\\", aDest + std::string(FindFileData.cFileName) + "\\");
    }
    while(FindNextFile(hFind, &FindFileData));
    FindClose(hFind);
  }
}

int main(void)
{
  DoScan("D:\\temp1\\", "D:\\temp2\\");
  return EXIT_SUCCESS;
}
Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 23:40 #8
jeg har kigget lidt i bog jeg har om det..
Jeg vil gerne have åbnet en txt fil hvor efter den læser en linjie og putter det i array.
// reading a text file
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
using namespace std;

int &put(int i);
int get(int i);
int vals[10];

int main () {
  char buffer[256];
  int i;
  ifstream examplefile ("example.txt");
  if (! examplefile.is_open())
  { cout << "Error opening file"; exit (1); }

  while (! examplefile.eof() )
  {
    examplefile.getline (buffer,100);
  put[i] = buffer;
  i++;
  }
  return 0;
}

Men det giver nogen fejl når jeg compiler det..
Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 23:40 #9
det hvad jeg er nået frem til
Avatar billede arne_v Ekspert
25. september 2004 - 23:43 #10
int main ()
{
  char buffer[256];
  ifstream examplefile ("example.txt");
  if (! examplefile.is_open())
  {
      cout << "Error opening file";
      exit (1);
  }
  while (! examplefile.eof() )
  {
      examplefile.getline (buffer,sizeof(buffer));
      // her skal sætte noget ind
  }
  return 0;
}
Avatar billede arne_v Ekspert
25. september 2004 - 23:45 #11
bertel>

Ja. do while i.s.f. while gør det muligt at ligge mere inde i løkken
hvilket kan flytte lidt rundt så man undgår forward erklæringen. Og
STL string gør at man undgår sprintf og temporære char array variable.
Avatar billede arne_v Ekspert
25. september 2004 - 23:46 #12
Hvad med noget a la:

int main ()
{
  int lineno;
  char buffer[100][256];
  ifstream examplefile ("example.txt");
  if (! examplefile.is_open())
  {
      cout << "Error opening file";
      exit (1);
  }
  lineno = 0;
  while (! examplefile.eof() )
  {
      examplefile.getline (buffer[lineno],sizeof(buffer[lineno]));
      lineno++;
  }
  return 0;
}
Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 23:52 #13
totalt fedt.. Takker
Avatar billede rasmus-madsen Nybegynder
25. september 2004 - 23:52 #14
svar lig en gang
Avatar billede arne_v Ekspert
25. september 2004 - 23:53 #15
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester