Dateien Kopieren



  • char * Dic;
            Dic = new char [TemporaryDic.Length()+10];
            strcpy(Dic,TemporaryDic.c_str());
            Dic[TemporaryDic.Length()] = '\0';
            Dic[TemporaryDic.Length()+1] = '\0';
            TemporaryDic = ExtractFilePath(Application->ExeName)+"Caches\\"+Servers->Items->Strings[Servers->ItemIndex]+"\\";
            char * Dest;
            Dest = new char [TemporaryDic.Length()+10];
            strcpy(Dest,TemporaryDic.c_str());
            Dest[TemporaryDic.Length()] = '\0';
            Dest[TemporaryDic.Length()+1] = '\0';
            COPYdir( Dic,Dest);
            delete Dic,Dest;
    
    void COPYdir(LPCTSTR srcod, LPCSTR dest)
    {
    SHFILEOPSTRUCT COPYDir;
    ZeroMemory(&COPYDir, sizeof(COPYDir));
    COPYDir.wFunc = FO_COPY;
    COPYDir.pFrom = srcod;
    COPYDir.pTo = dest;
    COPYDir.fFlags = NULL;
    SHFileOperation( &COPYDir);
    }
    

    also meine strings sind nullterminiert. für das \ verwende ich \\ ...

    aber ürbentwie sagt er mir immer quelldatei konnte nicht gefunden werden.

    Der ordner existiert. ich habs schon mit so wildcards probiert also . als "letztes" ( vor den 2, 0 terminierungen.( eigentlich sinds ja 3 ^^ ) oder auch mal *.. aber es kommt immer das gleiche. quelldatei konnte nicht gefunden werden



  • Hellseher- Code ??? 🕶

    Dic = new char [TemporaryDic.Length()+10];
            strcpy(Dic,TemporaryDic.c_str());
            Dic[TemporaryDic.Length()] = '\0';
            Dic[TemporaryDic.Length()+1] = '\0';
            TemporaryDic = ExtractFilePath(Application->ExeName)+"Caches\\"+Servers->Items->Strings[Servers->ItemIndex]+"\\";
    

    1. Dic anlegen
    2. TemporaryDic kopieren nach Dic
    3. TemporaryDic mit Inhalt versehen.

    ???

    Sicher, dass die Reihenfolge so passt?

    Gruss
    Frank



  • Wie lauten denn die Werte für pTo und pFrom genau?



  • DerAltenburger schrieb:

    Hellseher- Code ??? 🕶

    1. Dic anlegen
    2. TemporaryDic kopieren nach Dic
    3. TemporaryDic mit Inhalt versehen.

    guck mal was drunter steht 😃

    sri schrieb:

    Wie lauten denn die Werte für pTo und pFrom genau?

    src. F:\...\WDB\enGB\*
    dest. C:\Dokumente und...\Caches\Stoneraiders\

    ( Programmintern natürlich mit \\ )

    hab schon ne idee woran es liegen könnte. an whitespaces in den zu erstellenden ordnern viell. ich hab gerade ma ne funk. geschrieben um die zu ersetzen und werd jetzt ma gucken ^^



  • Probiere es mal mit

    src. F:\...\WDB\enGB\.
    dest. C:\Dokumente und...\Caches\Stoneraiders



  • schon lange probiert ^^ daran liegts net.
    an den whitespaces übrigens auch net.
    übrigens. * funtzt auch 😉 das ist ja das blöde manchmal kopiert ers und manchmal nicht. und ich krieg net raus wann...



  • Also ich hab den fehler gefunden,

    diese methode macht anscheinend schon die ordner, die erstellung der ordner ist allerdings zu langsam und wenn er dann versucht in den ordner zu kopieren der noch erstellt wird gibt es einen fehler. also muss man wenn man in einen ordner kopieren will der noch nicht vorher existiert diesen ordner erstellen. dann gehts.

    ich hab es jetzt so gelöst.

    ShellExecute(NULL,"open","cmd.exe",( "/c mkdir \"" + TemporaryDic +"\"" ).c_str(),NULL,SW_HIDE);
            for (int i = 0; i < 30; i++){
                    Sleep(100);
                    Application->ProcessMessages();
            }
            if ( COPYdir( Dic,Dest ) ){
                            Label4->Caption = "Couldn't Copy";
    
            }else{
                            Label4->Caption = "Copied Successful";
            }
            delete Dic,Dest;
    


  • rofl



  • hä ???

    mach doch

    move_file("von a" , "nach b");
    


  • *hust* deswegen heißt der thread auch "Dateien Kopieren"



  • Könnte man nicht auch CreateFile, ReadFile, und WriteFile fürs kopieren benutzen?
    -> leere datei erstellen
    -> alte datei mit read-access öffnen und auslesen
    -> neu erstellte datei mit ausgelesenden daten vollschreiben
    oder wäre das z.b. zu langsam/unhandlich/.. ?



  • so hatte ich das mal gemacht.. ist imho genausoschnell wie SHFileoperation...:

    bool CInstaller::CopySH(LPCTSTR pFromFolder, LPCTSTR pToFolder)
    {
    	//--- copy - routine ---
    	CString from = pFromFolder;
    	CString to   = pToFolder;
    
    	CString sRoot = to.Left( to.Find(_T("\\")) );
    	AddDirBackSlash(sRoot);
    
    	//get free disk space on targetdrive
    	__int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;
    	GetDiskFreeSpaceEx (sRoot, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);
    
    	//check if more than 500 MB (512000 KB)(524288000 B) available on destination drive
    	if(i64FreeBytes < 524288000)
    		return false;
    
    	CString toDir = ExtractDir(to);
    
    	//create new directory, if it don't exists
    	if(! DirectoryExists(toDir))
    	{
    		int iPos = 0;
    		while(true)
    		{
    			iPos = toDir.Find( _T("\\"), iPos + 1 );
    
    			if(iPos == -1)
    				break;
    
    			CString sTemp = toDir.Mid(0, iPos);
    			::CreateDirectory(sTemp,NULL);
    		}
    	}
    
    	try
    	{
    		//init source- and destinationfiles
    		CFile fromFile(from, CFile::modeRead | CFile::typeBinary  | CFile::shareDenyWrite);
    		CFile toFile;
    
    		toFile.Open(to, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    
    		fromFile.SeekToBegin();
    		DWORD dwRead;
    
    		//set buffer for reading/writing files
    		const int BUFSIZE = 1024;
    		BYTE buffer[BUFSIZE];
    
    		//read sourcefile and write destinationfile
    		do
    		{
    			dwRead = fromFile.Read(buffer, BUFSIZE);
    			toFile.Write(buffer, dwRead);			
    		}
    		while (dwRead > 0);
    	}
    	catch( CFileException* ex)
    	{
    		ex->Delete();
    	}
    
    	//Set file attributes for new file
    	SetFileAttributes(to, GetFileAttributes(from));
    
    	return true;
    }
    

    :schland: :schland: :schland: :schland:


Anmelden zum Antworten