Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 18:53 Der er 12 kommentarer og
1 løsning

tjek om størrelse er ens ?

Hejza allesammen.

Har denne kode:
#include <windows.h>
#include <fstream.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;

void DoCopy(std::string aSrc, std::string aDest, FILETIME &aSrcFileTime)
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind = FindFirstFile(aDest.c_str(), &FindFileData);
  if(hFind != INVALID_HANDLE_VALUE &&
      CompareFileTime(&aSrcFileTime, &FindFileData.ftLastWriteTime) < 0)
  {
      std::cout << "\nFilen er nyere.: " << aSrc << std::endl;
      return;
  }
  if(!CopyFile(aSrc.c_str(), aDest.c_str(), false))
      std::cerr << "Fejl opstaad. Kunne ikke kopiere filen: " << aSrc << std::endl;
  else
      std::cout << "\n" << aSrc << std::endl;
}
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)
  {
    std::cerr << "Fejl Opstaad. Beklager. " <<  GetLastError() << std::endl;
    return;
  }
  else
  {
    CreateDirectory(aDest.c_str(), 0);
    do
    {
        if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
          DoCopy(aSrc + FindFileData.cFileName, aDest + FindFileData.cFileName, FindFileData.ftLastWriteTime);
        }
        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);
  }
}

Men nu vil jeg gerne have lavet lidt om på det.
Når scriptet støder på en fil med samme fil navn skal den.

Inden tjekker hvilken fil der er sidst rettet skal den tjekke om de to filer har samme size.
Hvis de ikke har det skal den så tjekke hvilken der er sidst rettet.
Hvis de har samme size skal den bare kører til næste fil.


Kan nogen hjælpe med det?

På forhånd tak..
Avatar billede arne_v Ekspert
26. september 2004 - 18:58 #1
Dav igen.

:-)

Fra filens størrelse har du allerede.

FindFileData.nFileSizeLow indeholder størrelsen (op til 4 GB - derudover
bruges også FindFileData.nFileSizeHigh).
Avatar billede arne_v Ekspert
26. september 2004 - 18:59 #2
Til filens størrelse kan hentes på flere måder.

En af dem er:

struct stat buf;
stat("filbvn.dat",&buf);

så vil buf.st_size indeholde størrelsen.
Avatar billede arne_v Ekspert
26. september 2004 - 19:02 #3
Mere Windows agtigt:

GetFileSize("filnavn.dat", NULL)

vil returnere størrelsen (op til 4 GB - derover skal man sende et argument med over
i.s.f. NULL).
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 19:10 #4
hehe hej igen :D ..

problemmet ligger i at filerne altid vil være ældre. Der for vil jeg gerne have koden til at tjekke om filnavn.* s størrelse er det samme som den fil den har fundet..
Hvis størrelse er den samme skal den abre forsætte med næste fil.

Hvis ikke skal den tjekke gøre som den pjeler med at tjekke hvilken der rettet sidst..

Kan du ikke prøve at lægge det ind i koden i spmet ?
Avatar billede arne_v Ekspert
26. september 2004 - 19:50 #5
Prøv:

    do
    {
        if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
          if(FindFileData.nFileSizeLow != GetFileSize((aDest + FindFileData.cFileName).c_str(), NULL))
          DoCopy(aSrc + FindFileData.cFileName, aDest + FindFileData.cFileName, FindFileData.ftLastWriteTime);
        }
        else if(strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, ".."))
          DoScan(aSrc + std::string(FindFileData.cFileName) + "\\", aDest + std::string(FindFileData.cFileName) + "\\");
    }
    while(FindNextFile(hFind, &FindFileData));
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 23:17 #6
Giver fejl i linje 40:
          if(FindFileData.nFileSizeLow != GetFileSize((aDest + FindFileData.cFileName).c_str(), NULL))
Avatar billede arne_v Ekspert
26. september 2004 - 23:20 #7
Hvilken fejl ?
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 23:21 #8
40 C:\Dev-Cpp\Same Desk\main.cpp invalid conversion from `const void*' to `void*'
Avatar billede arne_v Ekspert
26. september 2004 - 23:23 #9
Prøv:

if(FindFileData.nFileSizeLow != GetFileSize((char*)(aDest + FindFileData.cFileName).c_str(), NULL))
Avatar billede rasmus-madsen Nybegynder
26. september 2004 - 23:31 #10
det virker.. takker... :) ..

Som altid har jeg et bonus spm til dig :D .. Hvordan opretter jeg en mappe ? på c: drevet
Avatar billede arne_v Ekspert
26. september 2004 - 23:32 #11
Det gør du jo med CreateDirectory funktione som du ogs bruger i koden ovenfor.
Avatar billede arne_v Ekspert
26. september 2004 - 23:33 #12
CreateDirectory("C:\\mappeX", NULL);
Avatar billede arne_v Ekspert
26. september 2004 - 23:33 #13
og et 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